2010-05-02 43 views

回答

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文件)。

+0

@SztupY:好,你的答案開車送我去實際解決方案。見下面。 – cibercitizen1 2010-05-02 10:36:28

1

瀏覽the documentation,它看起來像你應該有一個HTTPRequest,從中可以得到查詢字符串。然後您可以使用parse_query來獲取名稱/值散列。

另外,有可能只是調用query()會直接給你散列......我的Ruby-fu並不完全適合它,但你可能想至少試一試。

+0

的問題是我需要獲取與請求關聯的HTTPRequest的* instance *。 ()中的.rhtml內 – cibercitizen1 2010-05-02 09:00:18

+0

查詢失敗 順便提一下類名的HTTPRequest是可用的.rhtml, 內還我可以訪問的WEBrick的HttpServer對象 – cibercitizen1 2010-05-02 09:10:56

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的綁定對象(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 
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> 
+0

這有點奇怪,你必須使用eval – SztupY 2010-05-02 11:10:25

+0

@SztupY:嗯,這是正式的文檔(http://ruby-doc.org/core/classes/Binding.html)解釋如何找出價值的方式在上下文(綁定)中通過它的字符串名稱變量。 – cibercitizen1 2010-05-02 14:27:43

+0

是的,但是'binding'方法返回實際的綁定,所以'eval(「x」,binding)'應該等價於'eval(「x」)',這相當於簡單的'x'。 – SztupY 2010-05-02 17:29:23