我使用webrick(內置的紅寶石網絡服務器)來爲.rhtml 文件(嵌入了類似jsp的ruby代碼的html)提供服務。如何訪問由webrick提供的.rhtml頁面的html請求參數?
它工作正常,但我不知道如何從.rhtml文件中的ruby代碼中訪問參數 (例如http://localhost/mypage.rhtml?foo=bar) 。 (請注意,我沒有使用Rails框架,僅使用WEBrick +的.rhtml文件)
感謝
我使用webrick(內置的紅寶石網絡服務器)來爲.rhtml 文件(嵌入了類似jsp的ruby代碼的html)提供服務。如何訪問由webrick提供的.rhtml頁面的html請求參數?
它工作正常,但我不知道如何從.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文件中訪問(也可以使用servlet_request
和servlet_response
,但我不確定它們)。
如果不是這種情況,您也可以嘗試查詢CGI參數ENV["QUERY_STRING"]
並對其進行解析,但這隻能作爲最後的手段(它可能只適用於CGI文件)。
瀏覽the documentation,它看起來像你應該有一個HTTPRequest
,從中可以得到查詢字符串。然後您可以使用parse_query
來獲取名稱/值散列。
另外,有可能只是調用query()
會直接給你散列......我的Ruby-fu並不完全適合它,但你可能想至少試一試。
的問題是我需要獲取與請求關聯的HTTPRequest的* instance *。 ()中的.rhtml內 – cibercitizen1 2010-05-02 09:00:18
查詢失敗 順便提一下類名的HTTPRequest是可用的.rhtml, 內還我可以訪問的WEBrick的HttpServer對象 – cibercitizen1 2010-05-02 09:10:56
你沒有提供太多的細節,但我想你有一個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的綁定對象(binding在Kernel中定義,它代表執行代碼的上下文),所以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
這是解決方案:
(假設請求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>
這有點奇怪,你必須使用eval – SztupY 2010-05-02 11:10:25
@SztupY:嗯,這是正式的文檔(http://ruby-doc.org/core/classes/Binding.html)解釋如何找出價值的方式在上下文(綁定)中通過它的字符串名稱變量。 – cibercitizen1 2010-05-02 14:27:43
是的,但是'binding'方法返回實際的綁定,所以'eval(「x」,binding)'應該等價於'eval(「x」)',這相當於簡單的'x'。 – SztupY 2010-05-02 17:29:23
@SztupY:好,你的答案開車送我去實際解決方案。見下面。 – cibercitizen1 2010-05-02 10:36:28