如何访问webrick提供的.rhtml页面的html请求参数?

时间:2010-05-02 08:53:25

标签: ruby webrick rhtml

我正在使用webrick(内置的ruby webserver)来提供.rhtml 文件(嵌入了ruby代码的html - 像jsp)。

它工作正常,但我无法弄清楚如何访问参数 (例如http://localhost/mypage.rhtml?foo=bar) 来自.rhtml文件中的ruby代码。 (注意我没有使用rails框架,只有webrick + .rhtml文件)

由于

4 个答案:

答案 0 :(得分:3)

根据erbhandler的源代码,它以这种方式运行rhtml文件:

    Module.new.module_eval{
      meta_vars = servlet_request.meta_vars
      query = servlet_request.query
      erb.result(binding)
    }

所以绑定应该包含query(其中包含查询字符串的哈希)和meta_vars变量(包含环境的哈希值,如SERVER_NAME)可以在rhtml文件中访问(servlet_requestservlet_response也可以使用,但我不确定它们。)

如果不是这种情况,您也可以尝试查询CGI参数ENV["QUERY_STRING"]并解析它,但这应该只是作为最后的手段(它可能只适用于CGI文件)。

答案 1 :(得分: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>

答案 2 :(得分:1)

浏览the documentation,看起来您应该有一个HTTPRequest,您可以从中获取查询字符串。然后,您可以使用parse_query获取名称/值哈希值。

或者,有可能只是调用query()会直接给你哈希...我的Ruby-fu不太合适,但你可能想要尝试一下。

答案 3 :(得分:1)

您没有提供太多细节,但我想您有一个servlet来提供您将使用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是传递给servlet的HTTPRequest对象。

获得所需参数后,必须将其绑定到模板。在示例中,我们从self传递绑定对象(绑定在Kernel中定义,它表示代码正在执行的上下文),因此do_GET方法中定义的每个局部变量都可以在模板中使用。但是,您可以创建自己的绑定,例如,在调用'result'时传递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