4

私はwebrick(組み込みのruby Webサーバー)を使用して.rhtmlファイル(jspのようにrubyコードが埋め込まれたhtml)を提供しています。

正常に動作しますが、.rhtmlファイルのrubyコード内からパラメーター(http://localhost/mypage.rhtml?foo = barなど)にアクセスする方法がわかりません。(私はrailsフレームワークを使用しておらず、webrick + .rhtmlファイルのみを使用していることに注意してください)

ありがとう

4

4 に答える 4

3

これが解決策です:

(リクエストが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>
于 2010-05-02T10:35:22.923 に答える
3

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ファイルでのみ機能する可能性があります)。

于 2010-05-02T09:30:12.183 に答える
2

詳細はあまり説明しませんが、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
于 2010-05-02T10:11:05.923 に答える
1

ドキュメントを閲覧するHTTPRequestと、クエリ文字列を取得できるfromが必要なようです。次に、を使用parse_queryして名前/値のハッシュを取得できます。

あるいは、呼び出すだけでquery()直接ハッシュが得られる可能性があります...私のRuby-fuはそれを完全には理解していませんが、少なくとも試してみることをお勧めします。

于 2010-05-02T08:57:25.280 に答える