我正在使用 webrick(内置的 ruby 网络服务器)来提供 .rhtml 文件(嵌入了 ruby 代码的 html ——如 jsp)。
它工作正常,但我不知道如何从 .rhtml 文件的 ruby 代码中访问参数(例如http://localhost/mypage.rhtml?foo=bar )。(请注意,我没有使用 rails 框架,仅使用 webrick + .rhtml 文件)
谢谢
我正在使用 webrick(内置的 ruby 网络服务器)来提供 .rhtml 文件(嵌入了 ruby 代码的 html ——如 jsp)。
它工作正常,但我不知道如何从 .rhtml 文件的 ruby 代码中访问参数(例如http://localhost/mypage.rhtml?foo=bar )。(请注意,我没有使用 rails 框架,仅使用 webrick + .rhtml 文件)
谢谢
根据 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 文件中访问它们(andservlet_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>
您没有提供太多细节,但我想您有一个 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
这个例子是有限的,当你去 /my 总是处理相同的文件。这里应该根据请求路径来构造文件路径。这里我说了一个重要的词:“请求”,你需要的一切都在那里。
要获取 HTTP 标头参数,请使用 req[header_name]。要获取查询字符串中的参数,请使用 req.query[param_name]。req 是传递给 servlet 的 HTTPRequest 对象。
获得所需参数后,必须将其绑定到模板。在示例中,我们从 self 传递绑定对象(绑定在内核中定义,它表示代码正在执行的上下文),因此在 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
浏览文档,看起来您应该有一个HTTPRequest
可以从中获取查询字符串的文档。然后,您可以使用parse_query
来获取名称/值哈希。
或者,有可能只是调用query()
会直接给你散列......我的 Ruby-fu 不太适合它,但你可能想至少试一试。