はじめに
SinatraはRubyで記述されたWebアプリケーションを素早く、
すでに第7回で、
簡潔な文法で、
最近ではここ日本でも、
今回は、
Sinatra1.0
それでは、
方向性
初のメジャーバージョンとなると、
旧バージョンとの互換性
Sinatra1.
それまでの安定バージョンである0.
ほとんどの機能には対応機能が存在しますが、
廃止となる非推奨機能 | 今後推奨される対応方法・ |
---|---|
sinatra/ | Rack::Testの利用 |
sinatra/ sinatra/ sinatra/ | 使用しない |
Sinatra::Defaultクラス | Sinatra::Baseクラス |
:views_ | :viewsオプション |
erb、 | 明示的なライブラリのロード |
media_ | mime_ |
mimeメソッド | mime_ |
send_ | 使用しない |
Sinatra::Event、 | 現状のextensionsAPIの利用 |
set_ | setメソッド |
:envオプション | :environmentオプション |
stopメソッド | haltメソッド |
entity_ | etagメソッド |
headersメソッド | response['Header-Name']への代入 |
Sinatra. | Sinatra::Application |
Sinatra. | 明示的なリセットは必要なし |
Sinatra. | Sinatra::Base. |
Sinatra::ServerError | すべて内部エラーとして扱われ、 |
中でも、
また、
新しい機能
追加機能に関しては、
- afterメソッド。beforeメソッドに対して、
共通の後処理も可能に。 - Tiltの採用。Tiltはテンプレートエンジンのインタフェースを統合するための抽象レイヤで、
キャッシュ等の機能も提供される。また、 それに伴いmustacheやliquidほか、 新たなテンプレートエンジンもサポートに。 - ERB、
Erubis、 Hamlなどのコンパイルを初回起動時に行うことによる、 パフォーマンス最適化。 - settingsメソッド。setで設定した値を、
classとrequest両方のスコープから参照できる。optionsのより良い代替手段となる。 - オプション:reload_
templates。trueにした場合、 コンパイル済みのテンプレートのキャッシュが行われない。 - erubisヘルパメソッド。Erubisをテンプレートエンジンとして選択可能になる。
- cache_
control、 expiresメソッド。Cache-ControlヘッダによるHTTPキャッシュの制御が可能になった。 - 起動時の-oオプション。アドレスを指定して起動出来るようになった。
- Rack::Session::Cookieクラス。テスト実行環境において利用できる。
- 拡張モジュールによって基底クラスに変更が加えられた場合も、
Sinatra::Baseのサブクラス生成時に、 動的にルーティングやbeforeフィルタ、 テンプレート、 エラー処理が解決されるようになった。 - オプション:raise_
errorsの動作の変更。trueの場合、 以前までエラーはアプリケーションの外側でraiseされていたが、 基底クラス内でraiseされるようになった。falseの場合は、 errorブロックがあれば処理され、 ステータスコード500のエラーとして処理される。 - passメソッドを使用して、
かつルーティングにマッチしない場合、 または全てのルーティングがpassされた場合、 X-Cascadeヘッダが付加されるようになった。 - 静的ファイルを返す場合はフィルタ処理が機能しないようになった。
- passメソッドの引数にブロックが渡せるようになった。passした後、
その次のルーティングがマッチしない場合に実行される。
afterメソッドは初期のバーションから永らく姿を消しており、
目立たない変更ですが、
テンプレートに関する改善点も多いです。起動時にコンパイルされ、
総評すると、
2つのSinatra
Sinatraに関してよく話題にされる一つに、
この問いに答えるため、
それでは、
require 'rubygems'
require 'sinatra'
get '/' do
'Hello world!'
end
これぞまさしくSinatra、
require 'rubygems'
require 'sinatra/base'
class MyApp < Sinatra::Base
get '/' do
'Hello world!'
end
end
MyApp.run! :host => 'localhost', :port => 9090
これが"Modular"スタイルのSinatraコードです。一見して、
RubyKaigi2009におけるAaron Quintさんの講演の中で、
この"Modular"スタイルのSinatraでもっとも注目すべき点は、
require 'sinatra/base'
と、
Sinatra::Baseクラスはその名の通りSinatraのコアとなる基底クラスです。それ単体での利用は推奨されていません。
require 'sinatra'
とした"Classic"スタイルの場合、
そして、
トップレベル側から見れば、
しかし、
こうして、
拡張モジュールの作成
もう一つ、
Sinatraはとてもシンプルがゆえに、
もちろん、
Rackのミドルウェア開発というのは、
そこで、
拡張モジュール作成のルール
拡張モジュール作成には、
- Sinatra::Baseクラスをあらゆる手段
(オープンクラス、 include、 extendなど) において、 直接的変更をしないこと。 - 「require 'sinatra'」
ではなく、 「require 'sinatra/ base'」 を行うこと。 - 用意されたAPIをできるだけ用いること。つまりSinatra.
register とSinatra.helpers をつかうこと。 - Sinatra::モジュール名の階層で命名すること。
ルール1のSinatra::Baseクラスへの直接的変更を避ける、
次に、
Sinatra.helpers
helpersメソッドと言えば、
このAPIを利用する局面は、
require 'sinatra/base'
module Sinatra
module HTMLEscapeHelper
def h(text)
Rack::Utils.escape_html(text)
end
end
helpers HTMLEscapeHelper
end
require 'sinatra'
require 'sinatra/htmlescape'
get "/hello" do
h "1 < 2" # => "1 < 2"
end
Sinatra.register
registerメソッドもモジュールを指定しますが、
具体的には、
require 'sinatra/base'
module Sinatra
module SessionAuth
module Helpers
def authorized?
session[:authorized]
end
def authorize!
redirect '/login' unless authorized?
end
def logout!
session[:authorized] = false
end
end
def self.registered(app)
app.helpers SessionAuth::Helpers
app.set :username, 'frank'
app.set :password, 'changeme'
app.get '/login' do
"<form method='POST' action='/login'>" +
"<input type='text' name='user'>" +
"<input type='text' name='pass'>" +
"</form>"
end
app.post '/login' do
if params[:user] == options.username && params[:pass] == options.password
session[:authorized] = true
redirect '/'
else
session[:authorized] = false
redirect '/login'
end
end
end
end
register SessionAuth
end
SessionAuth
require 'sinatra'
require 'sinatra/sessionauth'
set :password, 'hoboken'
get '/public' do
if authorized?
"Hi. I know you."
else
"Hi. We haven't met. <a href='/login'>Login, please.</a>"
end
end
get '/private' do
authorize!
'Thanks for logging in.'
end
参照ドキュメント
公式ドキュメントは英語ですが、
現状、
まとめ
Sinatraの最初のコミットを今見てみると、
こうした発祥から、
そして誕生から1.
Sinatra::Baseクラスによる"Modular"スタイルのSinatraや、
Sinatraの先には、
もちろん自由には責任がつきまといますが、