初めてのPadrino 
~ Padrino を利用したWEBアプリケーション作成方法の紹介 ~ 
日本OSS推進フォーラム主催 
第4回アプリケーション部会勉強会 
2014 年12 月11日 
Takeshi Yabe ( @tyabe )
お話すること 
• 自己紹介 
• 第1部 Padrino 概要 
• 第2部 Padrino を使った開発の実践
Takeshi Yabe 
@tyabe 
- アプリケーションエンジニア 
- 主な担当はサーバサイド 
- Yokohama.rb, Shibuya.rb 
- Padrinoとの出会いは2011年頃
第1部 
Padrino 概要 
Padrinoとはどういったものか(歴史・特徴)を説明しつつ、 
Padrinoアーキテクチャの概説、特徴的機能等を説明します。
Padrino とは 
Ruby製のWebアプリケーションフレームワーク 
Webアプリケーションを手早く作るためのDSLである 
Sinatra のコードと設計思想をベースに、 
Webアプリケーション開発でよく使われるであろう 
ライブラリやヘルパーメソッドなどを追加することで、 
複雑なWebアプリケーション開発でも 
利用可能なようにすることを目的としている
Padrino とは
Padrino とは 
Padrino はイタリア語、英語だと Godfather 
“シナトラ”で作られているから らしい…
Padrino とは 
Sinatra ベース 
コードだけではなく設計方針も 
=> 使うときもコレが肝要
Sinatra 
“Sinatra is a DSL for quickly 
creating web applications in Ruby 
with minimal effort” 
http://www.sinatrarb.com/intro より引用 
Sinatra はフレームワークではなく、 
Webアプリケーション(Rackアプリケーション)を 
手早く簡単に記述するためのDSL
Sinatra 
クラシックスタイル 
1 require 'sinatra' 
2 
3 get '/' do 
4 "Hello, sinatra!" 
5 end 
モジュラースタイル 
1 require 'sinatra/base' 
2 
3 class App < Sinatra::Base 
4 get '/' do 
5 "Hello, world!" 
6 end 
7 end 
単体で使うシンプルなアプリならクラシックスタイル 
他のRackアプリと一緒に使うならモジュラースタイル
Sinatra 
簡潔であること 
複雑性は必要になったときに追加
Sinatra 
シンプル!! 
だけど…
my-project 
├── Gemfile 
├── Gemfile.lock 
├── Rakefile 
├── app.rb 
├── config 
│ └── database.rb 
├── config.ru 
├── db 
│ └── development.db 
├── log 
│ └── development.log 
├── mailer.rb 
├── public 
│ ├── javascripts 
│ │ └── app.js 
│ └── stylesheets 
│ └── app.css 
└── views 
├── index.slim 
└── layout.slim 
- ディレクトリ構造 
- DBの設定 
- ログの設定 
- ヘルパーメソッド 
- HTMLエスケープ 
- セッション 
- テスト環境 
- コンソールでの動作確認 
- Rakeタスク 
- などなど 
..楽したい! 
Sinatra
Padrino の歴史 
nesquena が個人で開発 
2009-10 : sinatra_more の開発がスタート 
2009-11 : padrino の開発がスタート(0.1.0 -> 0.2.1) 
2010-02 : sinatra_more が padrino への移行を表明 
2011-12 : sinatra_more 最後のコミット 
… 
2013-10 : 日本人が開発チーム入り(@namusyaka) 
2014-02 : 0.12.0 リリース 
Ruby 1.8 のサポート廃止など大きめの変更 
2014-04 : 0.12.1 リリース 
nesquena と、同僚だった 
DAddYE, achiu で開発 
新しいルーター( pendragon ) 
を開発 
dynamoid のサポート、cache_object helper の追加 
2014-05 : 0.12.2 リリース 
Params Protection の追加 
2014-08 : 0.12.3 リリース 
router, reloader, generator の改善 
2014-10 : 0.12.4 リリース 
mounter が改善され、他のRackアプリのマウントが可能になった
Padrino の利用者
Padrino の主な機能 
- ジェネレータ含むコマンドラインツール 
- サブアプリケーション 
- 他のRackアプリケーションのマウント 
- ルーティングの拡張 
- MVC パターンの導入 
- 豊富なヘルパーメソッド 
- 簡単なメール送信機能 
- キャッシュ機能 
- 国際化機能 
- 他のライブラリと連携可能なロガー 
- 開発時のリローダー
Padrino の構成 
Padrino Framework 
gen helpers 
support 
cache mailers 
admin 
core 
Sinatra
padrino-core
padrino-core 
Sinatra を拡張したベースアプリケーション 
PadrinoFramework の機能を全て使うことができる 
# lib/padrino-core/application.rb 
1 module Padrino 
2 class Application < Sinatra::Base 
3 register Padrino::ApplicationSetup 
4 register Padrino::Routing 
5 register Padrino::ParamsProtection 
register メソッドによる Sinatra 拡張の登録 
use メソッドによる Rack ミドルウェアの登録
padrino-core 
追加される主な機能 
- ルーティングの拡張 
- サブアプリケーションとその他のRackアプリのマウント機構 
- オートロード対象ディレクトリの設定 
- 拡張されたロガー 
- 開発用のリローダー 
- コマンドラインツール ( start, stop, generate, console, runner, rake )
padrino-core 
追加される主な機能 
- ルーティングの拡張 
- サブアプリケーションとその他のRackアプリのマウント機構 
- オートロード対象ディレクトリの設定 
- 拡張されたロガー 
- 開発用のリローダー 
- コマンドラインツール ( start, stop, generate, console, runner, rake )
padrino-core 
ルーティングの拡張(一例) 
1 SampleProject::App.controllers :posts do 
2 get :index do 
3 # url(:posts, :index) => "/posts" 
4 render 'posts/index' 
5 end 
6 
7 get :show, map: '/posts/:id' do 
8 # url(:posts, :show, id: 5) => "/posts/5" 
9 render 'posts/new' 
10 end 
11 end 
名前付きルート、テンプレートエンジンの自動検出
padrino-core 
拡張されたロガー
padrino-gen
padrino-gen 
新しいPadrinoプロジェクトの作成時や 
既存のPadrinoプロジェクトへ 
簡単にコードを追加することができるようになる 
- project 
- app 
- mailer 
- controller 
- helper 
- model 
- migration 
- plugin 
- component 
- task 
- admin 
- admin_page
padrino-gen 
新しいPadrinoプロジェクトの作成時や 
既存のPadrinoプロジェクトへ 
簡単にコードを追加することができるようになる 
- project 
- app 
- mailer 
- controller 
- helper 
- model 
- migration 
- plugin 
- component 
- task 
- admin 
- admin_page
padrino-gen ( プロジェクト生成 ) 
Usage: 
padrino-gen project [name] [options] 
Options: 
-n, [--app=APP] 
-b, [--bundle], [--no-bundle] 
-r, [--root=ROOT] 
[--dev], [--no-dev] 
-i, [--tiny], [--no-tiny] 
-l, [--lean], [--no-lean] 
-a, [--adapter=ADAPTER] 
-p, [--template=TEMPLATE] 
-g, [--gem], [--no-gem] 
padrino プロジェクトで使う場合は 
$ padrino g project 
[--migration-format=MIGRATION_FORMAT] 
-d, [--orm=ORM] 
-t, [--test=TEST] 
-m, [--mock=MOCK] 
-s, [--script=SCRIPT] 
-e, [--renderer=RENDERER] 
-c, [--stylesheet=STYLESHEET]
padrino-gen ( プロジェクト生成 ) 
ORM、データベースアダプタ、テンプレートエンジン、 
テスティングフレームワーク、モックライブラリ、 
スタイルシートエンジン、JavaScriptライブラリ 
必要なものだけを選んで使える ( 選ばなくても良い )
padrino-gen ( プロジェクト生成 ) 
$ padrino g project sample_project 
sample_project 
├── Gemfile 
├── Rakefile 
├── app 
│ ├── app.rb 
│ ├── controllers 
│ ├── helpers 
│ └── views 
│ └── layouts 
├── bin 
│ └── sample_project 
├── config 
│ ├── apps.rb 
│ └── boot.rb 
├── config.ru 
├── log 
├── public 
│ ├── favicon.ico 
│ ├── images 
│ ├── javascripts 
│ └── stylesheets 
└── tmp 
13 directories, 8 files 
$ padrino g project tiny_project ̶tiny 
tiny_project 
├── Gemfile 
├── Rakefile 
├── app 
│ ├── app.rb 
│ ├── controllers.rb 
│ ├── helpers.rb 
│ └── mailers.rb 
├── bin 
│ └── tiny_project 
├── config 
│ ├── apps.rb 
│ └── boot.rb 
├── config.ru 
├── log 
├── public 
│ ├── favicon.ico 
│ ├── images 
│ ├── javascripts 
│ └── stylesheets 
└── tmp 
9 directories, 11 files
padrino-gen ( コンポーネントの追加 ) 
Usage: 
padrino-gen component [options] 
Options: 
-n, [--app=APP] 
-r, [--root=ROOT] 
-a, [--adapter=ADAPTER] 
-d, [--orm=ORM] 
-t, [--test=TEST] 
-m, [--mock=MOCK] 
-s, [--script=SCRIPT] 
-e, [--renderer=RENDERER] 
-c, [--stylesheet=STYLESHEET] 
Description: 
padrino-gen component add components into a Padrino project 
Current Selected Components: 
orm none 
test none 
mock none 
script none 
renderer slim 
stylesheet none 
必要になったときに 
必要なものを追加できる
padrino-gen ( サブアプリケーション ) 
サブアプリケーションは 
モデルやライブラリを共通で使える 
$ padrino g admin 
$ padrino g app api 
sample_project 
├── app 
│ ├── app.rb 
│ ├── controllers 
│ ├── helpers 
│ └── views 
│ └── layouts 
├── admin 
│ ├── app.rb 
│ ├── controllers 
│ ├── helpers 
│ └── views 
│ └── layouts 
├── api 
│ ├── app.rb 
│ ├── controllers 
│ ├── helpers 
│ └── views 
│ └── layouts 
└── public 
├── admin 
│ ├── images 
│ ├── javascripts 
│ └── stylesheets 
├── favicon.ico 
├── images 
├── javascripts 
└── stylesheets 
# config/apps.rb 
1 Padrino.mount('SampleProject::Admin') 
2 .to('/admin') 
3 Padrino.mount('SampleProject::Api') 
4 .to('/') 
5 .host("api.example.org") 
6 Padrino.mount('SampleProject::App') 
7 .to(‘/') 
マウントの設定で、一致させるパスやホスト名を指定できる
padrino-admin
padrino-admin 
ユーザ認証付きの管理アプリが作成できるようになる 
$ padrino g admin
padrino-admin 
# config/apps.rb 
1 Padrino.mount('SampleProject::Admin').to('/admin') 
2 Padrino.mount('SampleProject::App').to('/') 
admin 
├── app.rb 
├── controllers 
│ ├── accounts.rb 
│ ├── base.rb 
│ └── sessions.rb 
└── views 
├── accounts 
│ ├── _form.slim 
│ ├── edit.slim 
│ ├── index.slim 
│ └── new.slim 
├── base 
│ └── index.slim 
├── errors 
│ ├── 403.slim 
│ ├── 404.slim 
│ └── 500.slim 
├── layouts 
│ ├── application.slim 
│ └── error.slim 
└── sessions 
└── new.slim 
7 directories, 15 files 
管理アプリはサブアプリケーションとして 
マウントする
padrino-admin
padrino-admin 
モデルに対応した管理ページを追加できる 
$ padrino g admin_page model
padrino-admin 
管理アプリ用のヘルパーメソッドがいくつか追加される 
1 module SampleProject 
2 class Admin < Padrino::Application 
3 register Padrino::Mailer 
4 register Padrino::Helpers 
5 register Padrino::Admin::AccessControl 
6 
7 set :admin_model, 'Account' 
8 set :login_page, '/sessions/new' 
9 
10 enable :sessions 
11 disable :store_location 
12 
13 access_control.roles_for :any do |role| 
14 role.protect '/' 
15 role.allow '/sessions' 
16 end 
17 
18 access_control.roles_for :admin do |role| 
19 role.project_module :posts, '/posts' 
20 role.project_module :accounts, '/accounts' 
21 end 
22 
23 # Custom error management 
24 error(403) { @title = "Error 403"; render('errors/403', :layout => :error) } 
25 error(404) { @title = "Error 404"; render('errors/404', :layout => :error) } 
26 error(500) { @title = "Error 500"; render('errors/500', :layout => :error) } 
27 end 
28 end
padrino-helpers
padrino-helpers 
フォームやリンク、画像用のタグなど 
HTMLタグを生成するメソッドが使用可能になる 
# => link_to や image_tag などRails と同じようなメソッドが定義されている 
input_tag :text, class: “demo” 
#=> <input type='text' class='demo' /> 
テンプレートをレンダリングするためのメソッド 
( render, partial ) が使用可能になる 
render ‘path/to/any/template' 
partial 'photo/_item', object: @photo, locals: { foo: 'bar' }
padrino-cache
padrino-cache 
テンプレートのレンダリング結果や 
任意のオブジェクトの内容をキャッシュできるようになる 
1 module SampleProject 
2 class App < Padrino::Application 
3 register Padrino::Cache 
4 enable :caching 
5 
6 get '/foo', cache: true do 
7 expires 10 
8 Time.now.to_s 
9 end 
10 end 
11 end 
キャッシュ機構のベースには Moneta が利用されており 
デフォルトで様々なキャッシュストアが利用可能となっている 
1 Padrino.cache = Padrino::Cache.new(:LRUHash) # default choice 
2 Padrino.cache = Padrino::Cache.new(:File, dir: Padrino.root('tmp', app_name.to_s, 'cache')) 
3 Padrino.cache = Padrino::Cache.new(:Memcached, backend: memcached_or_dalli_instance) 
4 Padrino.cache = Padrino::Cache.new(:Redis, backend: redis_instance) 
5 Padrino.cache = Padrino::Cache.new(:Mongo, backend: mongo_client_instance)
padrino-mailers
padrino-mailers 
シンプルなインターフェースでメール配信が行えるようになる 
ファイルの添付やマルチパートも可能 ( Mail ベース ) 
1 class App < Sinatra::Base 
2 register Padrino::Mailer 
3 
4 set :delivery_method, smtp: { 
5 address: ‘smtp.gmail.com’, 
6 port: 587, 
7 domain: 'your.host.name', 
8 user_name: '<username>', 
9 password: '<password>', 
10 authentication: 'plain', 
11 enable_starttls_auto: true 
12 } 
13 
14 post :mail do 
15 email do 
16 from: "foo@example.com", 
17 to: "bar@example.com", 
18 subject: "Welcome!", 
19 body: "This is test mail." 
20 end 
21 end 
22 
23 end 
1 module Sample 
2 class App < Padrino::Application 
3 register Padrino::Mailer 
4 
5 set :delivery_method, :sendmail 
6 
7 mailer :sample do 
8 email :welcome do 
9 from "foo@example.com" 
10 to "bar@example.com" 
11 subject "Welcome!" 
12 add_file "/path/to/someotherfile.png" 
13 provides :html, :plain 
14 render "sample" 
15 end 
16 end 
17 
18 post :mail do 
19 deliver :sample, :welcome 
20 end 
21 
22 end 
23 end
padrino-support
padrino-support 
padrino をサポートするためのライブラリ集 
String の拡張 ( colorize, pluralize ) や 
国際化対応用のyamlファイルが置いてある 
# 一部のメソッドは ActiveSupport のものをそのまま利用している
まとめ
まとめ 
Padrino とは、 
Sinatra の簡潔さを保ちつつ、 
複雑なアプリケーション開発に必要となるような機能を 
必要なときに付け加える事ができるようにした 
Webアプリケーションフレームワーク 
Agnostic 
ORMやテンプレートエンジンなどを自由に組み合わせ可能 
Mountable 
小さなRackアプリケーションを自由に組み合わせ可能
第2部 
Padrino を使った開発の実践 
Padrino で開発を行う際のTipsや 
問題の解決方法などを説明します。
Padrino のエコシステム
Padrino のエコシステム 
- Rackミドルウェア 
- rack-contrib 
- Sinatra の機能拡張 ( SinatraExtention ) 
- sinatra-contrib 
- Padrino の機能拡張 ( Padrino 用の SinatraExtention ) 
- padrino-contrib 
- Padrino のプラグイン機能 
- padrino-recipes に公式のレシピが公開されている
Padrino のエコシステム 
- Rackミドルウェア 
- rack-contrib 
- Sinatra の機能拡張 ( SinatraExtention ) 
- sinatra-contrib 
- Padrino の機能拡張 ( Padrino 用の SinatraExtention ) 
- padrino-contrib 
- Padrino のプラグイン機能 
- padrino-recipes に公式のレシピが公開されている
Padrino のプラグイン機能 ( Templates ) 
プロジェクトの作成手順が記述されたテンプレートファイルを元に 
新しいPadrinoプロジェクトを生成することができる 
$ padrino g project sample --template path/to/my_template.rb
Padrino のプラグイン機能 ( Templates )
Padrino のプラグイン機能 ( Plugins ) 
レシピファイルを元に、 
既存のPadrinoプロジェクトに機能追加が行える 
$ padrino g plugin path/to/my_plugin.rb
Padrino のプラグイン機能 ( Plugins )
その他 
- OmniAuth, Warden 
- jpmobile, Browser 
- will_paginate, Kaminari 
- Better Errors 
#=> Sinatra で使えるものは普通に使える 
- padrino-pipeline, padroni-assets 
#=> Padrino に特化したものもある
Padrino を使っていくと 
遭遇する問題
Padrino を使っていくと遭遇する問題 
- コードの肥大化 
- 各種コマンドでの起動が遅くなる 
- 開発サーバ起動後はリローダーが何とかしてくれるが… 
- Spring は Rails用だし Spork はメンテされていない 
- Sinatra の哲学に従い小さな部品に分割できないか 
- サブアプリケーション 
- アプリケーションの gem 化
Padrino 複数アプリ構成のサンプル
Padrino の情報源
Padrino の情報源 ( 公式ページ )
Padrino の情報源 ( 公式ドキュメント )
Padrino の情報源 ( ebook )
Padrino の情報源 ( 書籍・雑誌 )
Padrino の情報源 ( るびま ) 
0036号
Padrino の情報源 ( その他 )
Padrino の情報源 ( その他 )
Padrino の情報源 ( その他 )
Padrino の情報源 ( コード )
Padrino の情報源 ( idobata ) 
Padrino について雑談できる場所が欲しかったので作った 
https://idobata.io/organizations/padrino-framework-jp/rooms/public/join_request/ 
5b2dda52-c818-45f2-82d6-04c891cb2350
Padrino の今後
Padrino の今後 
Padrino 1.0 へ向けて 
- マルチスレッドのサポート 
- 新しいルーターの導入 
- PadrinoAdmin の刷新 
- ページネーション、検索・フィルタ、ダイナミックなUI など 
- リファクタリング 
- リローダー、ロガー 
- ドキュメントの整備 
依存を少なく、より堅牢でより高速なフレームワークを目指す 
Rack2.0, Sinatra2.0 の動向も注目
Padrino の今後
最後に
Padrino への貢献 
- ドキュメント 
- コードの中、公式ドキュメント、日本語 
- プラグイン 
- 動かないものへのパッチ、自分の欲しいもの 
- gem 
- Rackミドルウェア、SinatraExtention、Padrino専用 
- コード 
- コメント修正、バグ修正、新機能の提案
おまけ
その他のRuby製 
WebApplicationFramework 
個人的に気になっているもの
毎月第3水曜開催 
渋谷周辺で開催(不定) 
http://shibuyarb.doorkeeper.jp/

初めてのPadrino

  • 1.
    初めてのPadrino ~ Padrinoを利用したWEBアプリケーション作成方法の紹介 ~ 日本OSS推進フォーラム主催 第4回アプリケーション部会勉強会 2014 年12 月11日 Takeshi Yabe ( @tyabe )
  • 2.
    お話すること • 自己紹介 • 第1部 Padrino 概要 • 第2部 Padrino を使った開発の実践
  • 3.
    Takeshi Yabe @tyabe - アプリケーションエンジニア - 主な担当はサーバサイド - Yokohama.rb, Shibuya.rb - Padrinoとの出会いは2011年頃
  • 7.
    第1部 Padrino 概要 Padrinoとはどういったものか(歴史・特徴)を説明しつつ、 Padrinoアーキテクチャの概説、特徴的機能等を説明します。
  • 8.
    Padrino とは Ruby製のWebアプリケーションフレームワーク Webアプリケーションを手早く作るためのDSLである Sinatra のコードと設計思想をベースに、 Webアプリケーション開発でよく使われるであろう ライブラリやヘルパーメソッドなどを追加することで、 複雑なWebアプリケーション開発でも 利用可能なようにすることを目的としている
  • 9.
  • 10.
    Padrino とは Padrinoはイタリア語、英語だと Godfather “シナトラ”で作られているから らしい…
  • 11.
    Padrino とは Sinatraベース コードだけではなく設計方針も => 使うときもコレが肝要
  • 13.
    Sinatra “Sinatra isa DSL for quickly creating web applications in Ruby with minimal effort” http://www.sinatrarb.com/intro より引用 Sinatra はフレームワークではなく、 Webアプリケーション(Rackアプリケーション)を 手早く簡単に記述するためのDSL
  • 14.
    Sinatra クラシックスタイル 1require 'sinatra' 2 3 get '/' do 4 "Hello, sinatra!" 5 end モジュラースタイル 1 require 'sinatra/base' 2 3 class App < Sinatra::Base 4 get '/' do 5 "Hello, world!" 6 end 7 end 単体で使うシンプルなアプリならクラシックスタイル 他のRackアプリと一緒に使うならモジュラースタイル
  • 15.
  • 16.
  • 17.
    my-project ├── Gemfile ├── Gemfile.lock ├── Rakefile ├── app.rb ├── config │ └── database.rb ├── config.ru ├── db │ └── development.db ├── log │ └── development.log ├── mailer.rb ├── public │ ├── javascripts │ │ └── app.js │ └── stylesheets │ └── app.css └── views ├── index.slim └── layout.slim - ディレクトリ構造 - DBの設定 - ログの設定 - ヘルパーメソッド - HTMLエスケープ - セッション - テスト環境 - コンソールでの動作確認 - Rakeタスク - などなど ..楽したい! Sinatra
  • 19.
    Padrino の歴史 nesquenaが個人で開発 2009-10 : sinatra_more の開発がスタート 2009-11 : padrino の開発がスタート(0.1.0 -> 0.2.1) 2010-02 : sinatra_more が padrino への移行を表明 2011-12 : sinatra_more 最後のコミット … 2013-10 : 日本人が開発チーム入り(@namusyaka) 2014-02 : 0.12.0 リリース Ruby 1.8 のサポート廃止など大きめの変更 2014-04 : 0.12.1 リリース nesquena と、同僚だった DAddYE, achiu で開発 新しいルーター( pendragon ) を開発 dynamoid のサポート、cache_object helper の追加 2014-05 : 0.12.2 リリース Params Protection の追加 2014-08 : 0.12.3 リリース router, reloader, generator の改善 2014-10 : 0.12.4 リリース mounter が改善され、他のRackアプリのマウントが可能になった
  • 20.
  • 21.
    Padrino の主な機能 -ジェネレータ含むコマンドラインツール - サブアプリケーション - 他のRackアプリケーションのマウント - ルーティングの拡張 - MVC パターンの導入 - 豊富なヘルパーメソッド - 簡単なメール送信機能 - キャッシュ機能 - 国際化機能 - 他のライブラリと連携可能なロガー - 開発時のリローダー
  • 22.
    Padrino の構成 PadrinoFramework gen helpers support cache mailers admin core Sinatra
  • 23.
  • 24.
    padrino-core Sinatra を拡張したベースアプリケーション PadrinoFramework の機能を全て使うことができる # lib/padrino-core/application.rb 1 module Padrino 2 class Application < Sinatra::Base 3 register Padrino::ApplicationSetup 4 register Padrino::Routing 5 register Padrino::ParamsProtection register メソッドによる Sinatra 拡張の登録 use メソッドによる Rack ミドルウェアの登録
  • 25.
    padrino-core 追加される主な機能 -ルーティングの拡張 - サブアプリケーションとその他のRackアプリのマウント機構 - オートロード対象ディレクトリの設定 - 拡張されたロガー - 開発用のリローダー - コマンドラインツール ( start, stop, generate, console, runner, rake )
  • 26.
    padrino-core 追加される主な機能 -ルーティングの拡張 - サブアプリケーションとその他のRackアプリのマウント機構 - オートロード対象ディレクトリの設定 - 拡張されたロガー - 開発用のリローダー - コマンドラインツール ( start, stop, generate, console, runner, rake )
  • 27.
    padrino-core ルーティングの拡張(一例) 1SampleProject::App.controllers :posts do 2 get :index do 3 # url(:posts, :index) => "/posts" 4 render 'posts/index' 5 end 6 7 get :show, map: '/posts/:id' do 8 # url(:posts, :show, id: 5) => "/posts/5" 9 render 'posts/new' 10 end 11 end 名前付きルート、テンプレートエンジンの自動検出
  • 28.
  • 29.
  • 30.
    padrino-gen 新しいPadrinoプロジェクトの作成時や 既存のPadrinoプロジェクトへ 簡単にコードを追加することができるようになる - project - app - mailer - controller - helper - model - migration - plugin - component - task - admin - admin_page
  • 31.
    padrino-gen 新しいPadrinoプロジェクトの作成時や 既存のPadrinoプロジェクトへ 簡単にコードを追加することができるようになる - project - app - mailer - controller - helper - model - migration - plugin - component - task - admin - admin_page
  • 32.
    padrino-gen ( プロジェクト生成) Usage: padrino-gen project [name] [options] Options: -n, [--app=APP] -b, [--bundle], [--no-bundle] -r, [--root=ROOT] [--dev], [--no-dev] -i, [--tiny], [--no-tiny] -l, [--lean], [--no-lean] -a, [--adapter=ADAPTER] -p, [--template=TEMPLATE] -g, [--gem], [--no-gem] padrino プロジェクトで使う場合は $ padrino g project [--migration-format=MIGRATION_FORMAT] -d, [--orm=ORM] -t, [--test=TEST] -m, [--mock=MOCK] -s, [--script=SCRIPT] -e, [--renderer=RENDERER] -c, [--stylesheet=STYLESHEET]
  • 33.
    padrino-gen ( プロジェクト生成) ORM、データベースアダプタ、テンプレートエンジン、 テスティングフレームワーク、モックライブラリ、 スタイルシートエンジン、JavaScriptライブラリ 必要なものだけを選んで使える ( 選ばなくても良い )
  • 34.
    padrino-gen ( プロジェクト生成) $ padrino g project sample_project sample_project ├── Gemfile ├── Rakefile ├── app │ ├── app.rb │ ├── controllers │ ├── helpers │ └── views │ └── layouts ├── bin │ └── sample_project ├── config │ ├── apps.rb │ └── boot.rb ├── config.ru ├── log ├── public │ ├── favicon.ico │ ├── images │ ├── javascripts │ └── stylesheets └── tmp 13 directories, 8 files $ padrino g project tiny_project ̶tiny tiny_project ├── Gemfile ├── Rakefile ├── app │ ├── app.rb │ ├── controllers.rb │ ├── helpers.rb │ └── mailers.rb ├── bin │ └── tiny_project ├── config │ ├── apps.rb │ └── boot.rb ├── config.ru ├── log ├── public │ ├── favicon.ico │ ├── images │ ├── javascripts │ └── stylesheets └── tmp 9 directories, 11 files
  • 35.
    padrino-gen ( コンポーネントの追加) Usage: padrino-gen component [options] Options: -n, [--app=APP] -r, [--root=ROOT] -a, [--adapter=ADAPTER] -d, [--orm=ORM] -t, [--test=TEST] -m, [--mock=MOCK] -s, [--script=SCRIPT] -e, [--renderer=RENDERER] -c, [--stylesheet=STYLESHEET] Description: padrino-gen component add components into a Padrino project Current Selected Components: orm none test none mock none script none renderer slim stylesheet none 必要になったときに 必要なものを追加できる
  • 36.
    padrino-gen ( サブアプリケーション) サブアプリケーションは モデルやライブラリを共通で使える $ padrino g admin $ padrino g app api sample_project ├── app │ ├── app.rb │ ├── controllers │ ├── helpers │ └── views │ └── layouts ├── admin │ ├── app.rb │ ├── controllers │ ├── helpers │ └── views │ └── layouts ├── api │ ├── app.rb │ ├── controllers │ ├── helpers │ └── views │ └── layouts └── public ├── admin │ ├── images │ ├── javascripts │ └── stylesheets ├── favicon.ico ├── images ├── javascripts └── stylesheets # config/apps.rb 1 Padrino.mount('SampleProject::Admin') 2 .to('/admin') 3 Padrino.mount('SampleProject::Api') 4 .to('/') 5 .host("api.example.org") 6 Padrino.mount('SampleProject::App') 7 .to(‘/') マウントの設定で、一致させるパスやホスト名を指定できる
  • 37.
  • 38.
  • 39.
    padrino-admin # config/apps.rb 1 Padrino.mount('SampleProject::Admin').to('/admin') 2 Padrino.mount('SampleProject::App').to('/') admin ├── app.rb ├── controllers │ ├── accounts.rb │ ├── base.rb │ └── sessions.rb └── views ├── accounts │ ├── _form.slim │ ├── edit.slim │ ├── index.slim │ └── new.slim ├── base │ └── index.slim ├── errors │ ├── 403.slim │ ├── 404.slim │ └── 500.slim ├── layouts │ ├── application.slim │ └── error.slim └── sessions └── new.slim 7 directories, 15 files 管理アプリはサブアプリケーションとして マウントする
  • 40.
  • 41.
  • 42.
    padrino-admin 管理アプリ用のヘルパーメソッドがいくつか追加される 1module SampleProject 2 class Admin < Padrino::Application 3 register Padrino::Mailer 4 register Padrino::Helpers 5 register Padrino::Admin::AccessControl 6 7 set :admin_model, 'Account' 8 set :login_page, '/sessions/new' 9 10 enable :sessions 11 disable :store_location 12 13 access_control.roles_for :any do |role| 14 role.protect '/' 15 role.allow '/sessions' 16 end 17 18 access_control.roles_for :admin do |role| 19 role.project_module :posts, '/posts' 20 role.project_module :accounts, '/accounts' 21 end 22 23 # Custom error management 24 error(403) { @title = "Error 403"; render('errors/403', :layout => :error) } 25 error(404) { @title = "Error 404"; render('errors/404', :layout => :error) } 26 error(500) { @title = "Error 500"; render('errors/500', :layout => :error) } 27 end 28 end
  • 43.
  • 44.
    padrino-helpers フォームやリンク、画像用のタグなど HTMLタグを生成するメソッドが使用可能になる # => link_to や image_tag などRails と同じようなメソッドが定義されている input_tag :text, class: “demo” #=> <input type='text' class='demo' /> テンプレートをレンダリングするためのメソッド ( render, partial ) が使用可能になる render ‘path/to/any/template' partial 'photo/_item', object: @photo, locals: { foo: 'bar' }
  • 45.
  • 46.
    padrino-cache テンプレートのレンダリング結果や 任意のオブジェクトの内容をキャッシュできるようになる 1 module SampleProject 2 class App < Padrino::Application 3 register Padrino::Cache 4 enable :caching 5 6 get '/foo', cache: true do 7 expires 10 8 Time.now.to_s 9 end 10 end 11 end キャッシュ機構のベースには Moneta が利用されており デフォルトで様々なキャッシュストアが利用可能となっている 1 Padrino.cache = Padrino::Cache.new(:LRUHash) # default choice 2 Padrino.cache = Padrino::Cache.new(:File, dir: Padrino.root('tmp', app_name.to_s, 'cache')) 3 Padrino.cache = Padrino::Cache.new(:Memcached, backend: memcached_or_dalli_instance) 4 Padrino.cache = Padrino::Cache.new(:Redis, backend: redis_instance) 5 Padrino.cache = Padrino::Cache.new(:Mongo, backend: mongo_client_instance)
  • 47.
  • 48.
    padrino-mailers シンプルなインターフェースでメール配信が行えるようになる ファイルの添付やマルチパートも可能( Mail ベース ) 1 class App < Sinatra::Base 2 register Padrino::Mailer 3 4 set :delivery_method, smtp: { 5 address: ‘smtp.gmail.com’, 6 port: 587, 7 domain: 'your.host.name', 8 user_name: '<username>', 9 password: '<password>', 10 authentication: 'plain', 11 enable_starttls_auto: true 12 } 13 14 post :mail do 15 email do 16 from: "foo@example.com", 17 to: "bar@example.com", 18 subject: "Welcome!", 19 body: "This is test mail." 20 end 21 end 22 23 end 1 module Sample 2 class App < Padrino::Application 3 register Padrino::Mailer 4 5 set :delivery_method, :sendmail 6 7 mailer :sample do 8 email :welcome do 9 from "foo@example.com" 10 to "bar@example.com" 11 subject "Welcome!" 12 add_file "/path/to/someotherfile.png" 13 provides :html, :plain 14 render "sample" 15 end 16 end 17 18 post :mail do 19 deliver :sample, :welcome 20 end 21 22 end 23 end
  • 49.
  • 50.
    padrino-support padrino をサポートするためのライブラリ集 String の拡張 ( colorize, pluralize ) や 国際化対応用のyamlファイルが置いてある # 一部のメソッドは ActiveSupport のものをそのまま利用している
  • 51.
  • 52.
    まとめ Padrino とは、 Sinatra の簡潔さを保ちつつ、 複雑なアプリケーション開発に必要となるような機能を 必要なときに付け加える事ができるようにした Webアプリケーションフレームワーク Agnostic ORMやテンプレートエンジンなどを自由に組み合わせ可能 Mountable 小さなRackアプリケーションを自由に組み合わせ可能
  • 54.
    第2部 Padrino を使った開発の実践 Padrino で開発を行う際のTipsや 問題の解決方法などを説明します。
  • 55.
  • 56.
    Padrino のエコシステム -Rackミドルウェア - rack-contrib - Sinatra の機能拡張 ( SinatraExtention ) - sinatra-contrib - Padrino の機能拡張 ( Padrino 用の SinatraExtention ) - padrino-contrib - Padrino のプラグイン機能 - padrino-recipes に公式のレシピが公開されている
  • 57.
    Padrino のエコシステム -Rackミドルウェア - rack-contrib - Sinatra の機能拡張 ( SinatraExtention ) - sinatra-contrib - Padrino の機能拡張 ( Padrino 用の SinatraExtention ) - padrino-contrib - Padrino のプラグイン機能 - padrino-recipes に公式のレシピが公開されている
  • 58.
    Padrino のプラグイン機能 (Templates ) プロジェクトの作成手順が記述されたテンプレートファイルを元に 新しいPadrinoプロジェクトを生成することができる $ padrino g project sample --template path/to/my_template.rb
  • 59.
  • 60.
    Padrino のプラグイン機能 (Plugins ) レシピファイルを元に、 既存のPadrinoプロジェクトに機能追加が行える $ padrino g plugin path/to/my_plugin.rb
  • 61.
  • 62.
    その他 - OmniAuth,Warden - jpmobile, Browser - will_paginate, Kaminari - Better Errors #=> Sinatra で使えるものは普通に使える - padrino-pipeline, padroni-assets #=> Padrino に特化したものもある
  • 63.
  • 64.
    Padrino を使っていくと遭遇する問題 -コードの肥大化 - 各種コマンドでの起動が遅くなる - 開発サーバ起動後はリローダーが何とかしてくれるが… - Spring は Rails用だし Spork はメンテされていない - Sinatra の哲学に従い小さな部品に分割できないか - サブアプリケーション - アプリケーションの gem 化
  • 65.
  • 66.
  • 67.
    Padrino の情報源 (公式ページ )
  • 68.
    Padrino の情報源 (公式ドキュメント )
  • 69.
  • 70.
    Padrino の情報源 (書籍・雑誌 )
  • 71.
    Padrino の情報源 (るびま ) 0036号
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
    Padrino の情報源 (idobata ) Padrino について雑談できる場所が欲しかったので作った https://idobata.io/organizations/padrino-framework-jp/rooms/public/join_request/ 5b2dda52-c818-45f2-82d6-04c891cb2350
  • 77.
  • 78.
    Padrino の今後 Padrino1.0 へ向けて - マルチスレッドのサポート - 新しいルーターの導入 - PadrinoAdmin の刷新 - ページネーション、検索・フィルタ、ダイナミックなUI など - リファクタリング - リローダー、ロガー - ドキュメントの整備 依存を少なく、より堅牢でより高速なフレームワークを目指す Rack2.0, Sinatra2.0 の動向も注目
  • 79.
  • 80.
  • 81.
    Padrino への貢献 -ドキュメント - コードの中、公式ドキュメント、日本語 - プラグイン - 動かないものへのパッチ、自分の欲しいもの - gem - Rackミドルウェア、SinatraExtention、Padrino専用 - コード - コメント修正、バグ修正、新機能の提案
  • 83.
  • 84.
  • 88.