Rack 導入

Rack とは何なのか?

Rack

Rack の公式リポジトリ

Rack に関する体系的なドキュメント

Rack の前提知識(readme.md を読んでみた)

github に書かれている Rack の readme から、個人的に気になったポイントをつらつらと書きだしてみる。

まず Rack は、Web esrver と Web application の間に立って、お互いがやり取りできるようにするソフトウェア。イメージ的には以下の様な感じ。

Web server ←→ Rack ←→ Web application

Rack には、たくさんのミドルウェアが用意されているらしい。readme で紹介されていたものから、覚えておいたほうがよさそうなのは次のもの。

  • Rack::CommonLogger
    • Apache ライクなログファイルを作ってくれる
  • Rack::ShowException
    • クラッシュ時に、有用なバックトレースを吐き出してくれる

次のヘルパーを覚えておくと、Rack アプリケーションを構築する上で役に立つらしい。

  • Rack::Request
    • HTTP リクエストをラップして、使いやすくしてくれる。テストには Rack::MockRequest を使うと良いらしい。
  • Rack::Response
    • HTTP レスポンスの構築作業を助けてくれる。

チュートリアル1(Hello Rack!)

Ruby on Rack #1 - Hello Rack!

コマンドラインから「rackup」することで、簡単な web アプリケーションが立ち上がる所までできる。

チュートリアル2(What is Rack::Builder ?)

Ruby on Rack #2 - The Builder

Rack::Builder は Rack に含まれているライブラリ、ヘルパー的な存在。
ユーザーは Rack と一緒に Rack::Builder も使うことが出来る。これを使うことで、
素の Rack をそのまま使うよりも、ちょっとだけ色々なことが便利にできるようになるという話しらしい。

Rack::Builder に関するチュートリアルで解説されているのは、次の2つのインスタンスメソッド。

  • Rack::Builder#use
  • Rack::Builder#map
Rack::Builder#use

use メソッドは、Ruby の require に近い役割を果たす。
例えば、Rack::CommonLogger を使えるようにするには、次のようなコードを記述すれば OK らしい。

# Original → http://m.onkey.org/ruby-on-rack-2-the-builder

infinity = Proc.new {|env| [200, {"Content-Type" => "text/html"}, env.inspect]}
builder = Rack::Builder.new do
  use Rack::CommonLogger
  run infinity
end
Rack::Handler::Mongrel.run builder, :Port => 9292
Rack::Builder#map

map メソッドは、Ruby on Rails で言うところの URI ルーティングのような機能をサポートしてくれる。
'/' という URI と、'/version' という URI へアクセスがあったときの処理を記述する方法は、以下の通り。

infinity = Proc.new {|env| [200, {"Content-Type" => "text/html"}, env.inspect]}
builder = Rack::Builder.new do
  use Rack::CommonLogger

  map '/' do
    run infinity
  end

  map '/version' do
    run Proc.new {|env| [200, {"Content-Type" => "text/html"}, "infinity 0.1"] }
  end
end
Rack::Handler::Mongrel.run builder, :Port => 9292




Rack の lobster(ロブスター)

Rack のテスト

  • Rack のテストには「ベーコン・テスティング・フレームワーク(the bacon testing framework)」を使う。
  • 素敵な名前!