GitHub

RackReferenceJa

RubyのためのWebサーバインターフェイス、Rackの日本語リファレンスです。

rack 1.3.0 (Rackプロトコル 1.1) 対応。

Rackがどういうものなのかについては Route 477 - 5分でわかるRack を参照してください。

{{toc_here}}

概要

Hello Rack

インストール:

 $ gem install rack

hello.rb:

 require 'rubygems'
 require 'rack'
 class HelloApp
   def call(env)
     [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]]
   end
 end

hello.ru:

 require './hello.rb'
 run HelloApp.new

サーバ起動:

 $ rackup hello.ru

ブラウザで http://localhost:9292/ にアクセスしてみよう。「Hello, Rack」と表示されたはず。

Rackの規格書

envの扱いかたなどの取り決めは以下に書かれている。

Rackミドルウェア

Rackのレイヤでいろいろな機能を追加することができる。

  • CodeRack 2009年に行われたRackのミドルウェアコンテストの跡地。ネタ系から実用系までたくさんのミドルウェアが掲載されている。

Rackのソース

クラスごとにファイル分けされている。

Rack::Request

req = Rack::Request.new(env) とか。

データ

req.params() GETやPOSTで送られてきたデータをHashとして返す。
req.[](key) params[key]と同じ。
req.[]=(key, value) params[key] = value と同じ。
req.values_at(k1, k2...) 指定したキーに対応するデータを配列で返す。
req.cookies() クッキーを表すHashを返す。
req.query_string() HTTP GETのクエリストリングを返す。
req.body() HTTP POSTのリクエストボディを返す。
req.GET() HTTP GETのクエリストリングをHashにしたものを返す。
req.POST() HTTP POSTのリクエストボディをHashにしたものを返す。multipart対応。

URL

req.url() リクエストされたURLを、環境変数から再構築して返す。
req.scheme() URLのスキーム部分を返す。
req.host() URLのホスト名を返す。
req.port() URLのポート部分を整数で返す。
req.fullpath() URLのパス部分を返す。

リクエストメソッド

req.request_method() HTTPのリクエストメソッドを返す。
req.delete?() HTTP DELETEならtrueを返す。
req.get?() HTTP GETならtrueを返す。
req.post?() HTTP POSTならtrueを返す。
req.put?() HTTP PUTならtrueを返す。
req.xhr?() Ajax通信(XmlHttpRequest)ならtrueを返す。

その他

req.path_info() ENV["PATH_INFO"] を返す。
req.path_info=(s) ENV["PATH_INFO"] を設定する。
req.referer() ENV["HTTP_REFERER"]か、"/" を返す。
req.referrer() referer()と同じ。{{fn "こちらの方が英語としては正しいが、技術用語としてはrefererが広く使われている。"}}
req.script_name() ENV["SCRIPT_NAME"] を返す。
req.script_name=(s) ENV["SCRIPT_NAME"] を設定する。

Rack::Response

res = Rack::Response.new() とか。

Response.new(body=[], status=200, header={}) {|self if block_given?| ...} 新しいレスポンスオブジェクトを作る。
res.[]=(key, value) レスポンスヘッダのkeyに対応するデータを設定する。
res.[](key) レスポンスヘッダのkeyに対応するデータを返す。
res.write(str) bodyに文字列を追加する。
res.empty? 現在のbodyが空ならtrueを返す。
res.set_cookie(key, value) クッキーを設定する。
res.delete_cookie(key, value) クッキーを削除する?
res.finish resに溜めたデータを [200, {}, []] 形式で返す。
res.to_a finishと同じ。
res.each{...} body.eachを呼ぶ。
res.close bodyがファイル等のとき、body.closeを呼ぶ。

以下はRack::Request::Helpersのメソッド。

res.content_length() レスポンスのcontent_lengthを整数で返す。
res.content_type() レスポンスのcontent_typeを文字列で返す。
res.location() レスポンスヘッダのLocationを返す。
res.include?(header) レスポンスヘッダにheaderというキーがあればtrueを返す。
res.informational?() ステータスコードが100台ならtrueを返す。
res.successful?() ステータスコードが200台ならtrueを返す。
res.redirection?() ステータスコードが300台ならtrueを返す。
res.client_error?() ステータスコードが400台ならtrueを返す。
res.server_error?() ステータスコードが500台ならtrueを返す。
res.invalid?() ステータスコードが不正(100未満か600以上)ならtrueを返す。
res.ok?() ステータスコードが200ならtrueを返す。
res.empty?() ステータスコードが201, 204, 304のいずれかならtrueを返す。
res.redirect?() ステータスコードが301, 302, 303, 307のいずれかならtrueを返す。
res.forbidden?() ステータスコードが403ならtrueを返す。
res.not_found?() ステータスコードが404ならtrueを返す。

ユーティリティ

Rack::Utils

include Rack::Utils として使う。

escape_html(s) 文文字列をHTMLに含めるためにエスケープする。
escape(s) 文字列をURLに含めるためにエスケープする。
unescape(s) URLエンコードされた文字列を元に戻す。
parse_query(s, d='&;') クエリストリングを分解したハッシュを返す。

Rack::MockRequest

架空のリクエストを作る。テスト用。

Rack::MockResponse

架空のレスポンスを作る。テスト用。

ミドルウェア (抜粋)

Rack::Auth::Basic

Basic認証を行う。

 protected_app = Rack::Auth::Basic.new(app) do |username, password|
   'j230ru80u' == password
 end

もしくは

 use Rack::Auth::Basic { |username, password|
   'j230ru80u' == password
 }

みたいに書けると思う(未確認)。

Rack::Auth::Digest

Digest認証を行う。

Rack::Reloader

リクエスト時に、Rubyスクリプトが更新されていたらリロードする。 (ただし、重くなるのを避けるため、一度リロードしたら10秒間はリロードしない。 この秒数は設定可能。)

 use Rack::Reloader, 20

Rack::File

静的ファイルを表示させるためのアプリケーション(ミドルウェアではない!)。

Rack::Cascadeと組み合わせると、「ファイルが存在しなかったときだけ 俺アプリを呼び出す」のようなことができる。

 use Rack::Cascade,
   Rack::File.new("./public/html/"), MyApp.new

「/cssや/imagesだけ静的ファイル」のような場合はRack::Staticの方が向いている。

Rack::Cascade

複数のアプリケーションを並べて、「404だったら次のを試す」のような動作をする。

オプションで、キャッチするステータスコードを指定することができる(デフォルトは404)。

Rack::Static

指定したディレクトリだけ静的ファイルを表示させる。

 use Rack::Static, :urls => ["/css", "/images"], :root => "public"

Rack::Lint

自分のアプリケーションが、RequestとResponseを正しく使っているかチェックしてくれる。

 use Rack::Lint

Rack::ShowExceptions

アプリケーションで例外が起きたときに詳細なエラーページを表示する。 使うのは開発中だけにしよう(セキュリティ的な意味で)。

 use Rack::ShowExceptions

Rack::ShowStatus

アプリケーションが、ステータスコードが400台・500台の空のレスポンスを返したとき、 エラーページを表示する。 env["rack.showstatus.detail"] に情報を入れておくとそれも表示される。

 use Rack::ShowStatus

Rack::CommonLogger

Apacheのcommon log形式でアプリケーションのログを取る。

 use Rack::CommonLogger

もしくは

 use Rack::CommonLogger, MyLogger.new

loggerは << というメソッドが定義されているものなら何でもいい。(例えばStringとか)

Rack::Recursive

アプリケーション内から別のパスに飛ばせるようにする。

 use Rack::Recursive

自分のアプリケーションでリダイレクトしたくなったら

 raise Rack::ForwardRequest.new("/notfound")

とすると、"/notfound" に対応したアプリケーションが実行される。

Rack::Session::Cookie

クッキーベースのセッション管理を提供する。 セッションデータはRubyのハッシュで表され、env['rack.session']に入っている。 その中身はRubyのオブジェクトをMarshalでシリアライズしてbase64エンコードしたものになる。

 use Rack::Session::Cookie

もしくは

 use Rack::Session::Cookie, :key => 'rack.session',
                            :domain => 'foo.com',
                            :path => '/',
                            :expire_after => 2592000

ruファイルの書き方

基本的に、Rubyスクリプトである。利便性のため、use, run, mapなど のメソッドが定義されている。

useでミドルウェアを並べて、runでアプリケーションを指定するのが基本。

 require 'hello'
 use Rack::Lint
 run HelloApp.new

mapを使うと、パスごとに別のアプリケーションを割り当てることができる。

 require 'foo-app'
 require 'bar-app'

 use Rack::CommonLogger

 map "/foo" do
   use Rack::Session::Cookie
   run FooApp.new
 end

 map "/bar" do
   run BarApp.new
 end

リンク

参考サイトです。

source: RackReferenceJa.hd
View on github | Report issue