前回の記事では、
rackupとRack::Builder
前回の記事の最後で、
実は、
if __FILE__ == $0
require 'rack/handler/webrick'
Rack::Handler::WEBrick.run SimpleApp.new, :Port => 9292
end
rackupから起動した場合と特にかわらない結果になったと思います。前回の構成でrackupコマンドを実行した場合、
一つは、
また、
もう一つは、
if __FILE__ == $0
require 'rack/builder'
require 'rack/handler/webrick'
app = Rack::Builder.new {
run SimpleApp.new
}
Rack::Handler::WEBrick.run app, :Port => 9292
end
Rack::Builderのブロックの中身がrackupファイルと同じになっているのにお気付きでしょうか。rackupコマンドは、
つまり、
Rack::Request/Rack::Response
前回の記事では、
そのため、
前回使ったアプリケーションを上記のクラスを使って書き変えると、
# coding: utf-8
require 'rack/request'
require 'rack/response'
class SimpleApp
def call(env)
req = Rack::Request.new(env)
body = case req.request_method
when 'GET'
'<html><body><form method="POST"><input type="submit" value="見たい?" /></form></body></html>'
when 'POST'
'<html><body>何見てんだよ。</body></html>'
end
res = Rack::Response.new { |r|
r.status = 200
r['Content-Type'] = 'text/html;charset=utf-8'
r.write body
}
res.finish
end
end
HashやArrayよりは少し扱いやすくなりました。上記のコードでは使っていませんが、
Rack::MockRequest
Webアプリケーションを書く際、
以下のコードはSimpleAppの挙動をテストする単体テストですが、
# coding: utf-8
require 'simple_app'
require 'test/unit'
require 'rack/mock'
class SimpleAppTest < Test::Unit::TestCase
def setup
@app = SimpleApp.new
@mr = Rack::MockRequest.new(@app)
end
def test_get
res = nil
assert_nothing_raised('なんか失敗した') { res = @mr.get('/', :lint => true) }
assert_not_nil res, 'レスポンス来てない'
assert_equal 200, res.status, 'ステータスコードが変'
assert_equal 'text/html;charset=utf-8', res['Content-Type'], 'Content-Typeが変'
assert_match /見たい?/, res.body, '本文が変'
end
def test_post
res = nil
assert_nothing_raised('なんか失敗した') { res = @mr.post('/', :lint => true) }
assert_not_nil res, 'レスポンス来てない'
assert_equal 200, res.status, 'ステータスコードが変'
assert_equal 'text/html;charset=utf-8', res['Content-Type'], 'Content-Typeが変'
assert_match /何見てんだよ。/, res.body, '本文が変'
end
end
これを利用することで、
Rack::URLMap
Rack::URLMapはRackの
このアプリケーションはパスとアプリケーションのマッピングを保持しておき、
例えば、
# config: utf-8
require 'simple_app'
require 'rack/lobster'
map '/simple' do
run SimpleApp.new
end
map '/lobster' do
# Rackをインストールすると
# サンプルとして付いてくるアプリケーション
# ちょっと面白い
run Rack::Lobster.new
end
config.
ちなみに、
urlmap = Rack::URLMap.new( '/simple' => SimpleApp.new, '/lobster' => Rack::Lobster.new )
Rack::URLMapでは複雑なURLの解決はできませんので、
まとめ
今回は、
次回は、