Webrickが提供する.RHTMLページのHTML要求パラメーターにアクセスする方法は?

StackOverflow https://stackoverflow.com/questions/2752906

  •  02-10-2019
  •  | 
  •  

質問

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_requestservlet_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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top