Webrickが提供する.RHTMLページのHTML要求パラメーターにアクセスする方法は?
質問
Webrick(組み込みのRuby WebServer)を使用して、.RHTMLファイル(Rubyコードが埋め込まれたHTML)を提供しています。
正常に動作しますが、パラメーターにアクセスする方法を理解できません(例: http://localhost/mypage.rhtml?foo = bar).RHTMLファイルのRubyコード内から。 (Railsフレームワークを使用していないことに注意してください。Webrick + .RHTMLファイルのみです)
ありがとう
解決
erbhandlerのソースコードによると、この方法でRHTMLファイルを実行します。
Module.new.module_eval{
meta_vars = servlet_request.meta_vars
query = servlet_request.query
erb.result(binding)
}
したがって、バインディングにはaが含まれている必要があります query
(クエリ文字列のハッシュが含まれています)と meta_vars
変数(環境のハッシュが含まれています。 SERVER_NAME
)RHTMLファイル内(および servlet_request
と servlet_response
また利用できるかもしれませんが、私はそれらについてはわかりません)。
そうでない場合は、CGIパラメーターを照会することもできます ENV["QUERY_STRING"]
それを解析しますが、これは最後の手段としてのみであるべきです(そして、CGIファイルでのみ動作する可能性があります)。
他のヒント
これが解決策です:
(リクエストがあると仮定します http://your.server.com/mypage.rhtml?foo=bar)
<html>
<body>
This is my page (mypage.rhtml, served by webrick)
<%
# embedded ruby code
servlet_request.query ["foo"] # this simply prints bar on console
%>
</body>
</html>
ブラウジング ドキュメント, 、あなたが持っているべきだと思われます HTTPRequest
クエリ文字列を取得できます。その後、使用できます parse_query
名前/値ハッシュを取得します。
あるいは、電話だけである可能性があります query()
ハッシュを直接与えます...私のRuby-Fuはそれまでのことではありませんが、少なくとも試してみたいと思うかもしれません。
詳細はあまりありませんが、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
この例は限られています。ここで、リクエストパスに基づいてファイルパスを構築する必要があります。ここで私は重要な言葉を言った:「リクエスト」、あなたが必要とするすべてがそこにある。
HTTPヘッダーパラメーターを取得するには、req [header_name]を使用します。クエリ文字列でパラメーターを取得するには、req.query [param_name]を使用します。 Reqは、サーブレットに渡されたHTTPRequestオブジェクトです。
必要なパラメーターを取得したら、テンプレートにバインドする必要があります。この例では、バインディングオブジェクトを自己から渡します(バインディングはカーネルで定義され、コードが実行されているコンテキストを表します)。したがって、DO_GETメソッドで定義されているすべてのローカル変数がテンプレートで利用可能になります。ただし、たとえばProcオブジェクトを渡すなど、独自のバインディングを作成し、「結果」を呼び出すときに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