首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问webrick提供的.rhtml页面的html请求参数?

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

Stack Overflow用户
提问于 2010-05-02 16:53:25
回答 4查看 2.7K关注 0票数 4

我正在使用webrick (内置的ruby with服务器)来提供.rhtml文件(嵌入了ruby代码的html--比如jsp)。

它工作得很好,但是我不知道如何从.rhtml文件的ruby代码中访问参数(例如http://localhost/mypage.rhtml?foo=bar)。(请注意,我没有使用rails框架,只使用了webrick + .rhtml文件)

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-02 17:30:12

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

代码语言:javascript
复制
    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文件)。

票数 3
EN

Stack Overflow用户

发布于 2010-05-02 18:35:23

这就是解决方案:

(假设请求为http://your.server.com/mypage.rhtml?foo=bar)

代码语言:javascript
复制
 <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>
票数 3
EN

Stack Overflow用户

发布于 2010-05-02 18:11:06

您没有提供太多细节,但我假设您有一个servlet来服务于您将使用erb处理的文件,并且在默认情况下,web服务器提供公共目录中的任何静态文件。

代码语言:javascript
复制
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时,始终会处理相同的文件。在这里,您应该根据请求路径构造文件路径。这里我说了一个重要的词:“请求”,你需要的一切都在那里。

要获取header参数,请使用reqheader_name。要获取查询字符串中的参数,请使用req.queryparam_name。req是传递给servlet的HTTPRequest对象。

一旦有了所需的参数,就必须将其绑定到模板。在示例中,我们从self传递binding对象(binding是在内核中定义的,它表示代码执行的上下文),因此在do_GET方法中定义的每个局部变量都将在模板中可用。但是,您可以创建自己的绑定,例如传递一个Proc对象,并在调用'result‘时将其传递给ERB处理器。

将所有内容放在一起,您的解决方案将如下所示:

代码语言:javascript
复制
  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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2752906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档