詳細はあまり説明しませんが、erbで処理するファイルを提供するサーブレットがあり、デフォルトでは、Webサーバーがパブリックディレクトリ内の静的ファイルを提供していると思います。
require 'webrick'
include WEBrick
require 'erb'
s = HTTPServer.new( :Port => 8080,:DocumentRoot => Dir::pwd + "/public" )
class MyServlet < HTTPServlet::AbstractServlet
def do_GET(req, response)
File.open('public/my.rhtml','r') do |f|
@template = ERB.new(f.read)
end
response.body = @template.result(binding)
response['Content-Type'] = "text/html"
end
end
s.mount("/my", MyServlet)
trap("INT"){
s.shutdown
}
s.start
この例は制限されており、/ myに移動すると、常に同じファイルが処理されます。ここでは、リクエストパスに基づいてファイルパスを作成する必要があります。ここで私は重要な言葉を言いました:「リクエスト」、あなたが必要とするすべてがそこにあります。
HTTPヘッダーパラメータを取得するには、req[header_name]を使用します。クエリ文字列のパラメータを取得するには、req.query[param_name]を使用します。reqは、サーブレットに渡されるHTTPRequestオブジェクトです。
必要なパラメーターを取得したら、それをテンプレートにバインドする必要があります。この例では、バインディングオブジェクトをselfから渡します(バインディングはカーネルで定義され、コードが実行されているコンテキストを表します)。したがって、do_GETメソッドで定義されたすべてのローカル変数がテンプレートで使用可能になります。ただし、独自のバインディングを作成することもできます。たとえば、Procオブジェクトを渡して、「result」を呼び出すときにERBプロセッサに渡すことができます。
すべてを合わせると、ソリューションは次のようになります。
def do_GET(req, response)
File.open('public/my.rhtml','r') do |f|
@template = ERB.new(f.read)
end
foo = req.query["foo"]
response.body = @template.result(binding)
response['Content-Type'] = "text/html"
end