私はwebrick(組み込みのruby Webサーバー)を使用して.rhtmlファイル(jspのようにrubyコードが埋め込まれたhtml)を提供しています。
正常に動作しますが、.rhtmlファイルのrubyコード内からパラメーター(http://localhost/mypage.rhtml?foo = barなど)にアクセスする方法がわかりません。(私はrailsフレームワークを使用しておらず、webrick + .rhtmlファイルのみを使用していることに注意してください)
ありがとう
私はwebrick(組み込みのruby Webサーバー)を使用して.rhtmlファイル(jspのようにrubyコードが埋め込まれたhtml)を提供しています。
正常に動作しますが、.rhtmlファイルのrubyコード内からパラメーター(http://localhost/mypage.rhtml?foo = barなど)にアクセスする方法がわかりません。(私はrailsフレームワークを使用しておらず、webrick + .rhtmlファイルのみを使用していることに注意してください)
ありがとう
これが解決策です:
(リクエストが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>
erbhandlerのソースコードによると、rhtmlファイルは次のように実行されます。
Module.new.module_eval{
meta_vars = servlet_request.meta_vars
query = servlet_request.query
erb.result(binding)
}
したがって、バインディングには、rhtmlファイル内でアクセスできる(およびも使用できる可能性がありますが、私は)変数(のような環境のハッシュを含むquery)と変数(クエリ文字列のハッシュを含む)が含まれている必要があります。 mそれらについてわからない)。meta_varsSERVER_NAMEservlet_requestservlet_response
そうでない場合は、CGIパラメーターENV["QUERY_STRING"]を照会して解析することもできますが、これは最後の手段としてのみ行う必要があります(CGIファイルでのみ機能する可能性があります)。
詳細はあまり説明しませんが、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
ドキュメントを閲覧するHTTPRequestと、クエリ文字列を取得できるfromが必要なようです。次に、を使用parse_queryして名前/値のハッシュを取得できます。
あるいは、呼び出すだけでquery()直接ハッシュが得られる可能性があります...私のRuby-fuはそれを完全には理解していませんが、少なくとも試してみることをお勧めします。