2014-10-16 34 views
0

我在Ubuntu上安裝了apache的phusion-passenger。在我config.ru,我有以下代碼:Ruby cgi需要重新加載Apache的新值?

require 'cgi' 

$tpl = CGI.new['myvar'] + '.rb' 

app = proc do |env| 
    [200, { "Content-Type" => "text/html" }, [$tpl]] 
end 
run app 

所以後來當我去我的瀏覽器在http://localhost/?myvar=hello,我看到打印出來的字hello,這是罰款。然後我將url更改爲http://localhost/?myvar=world,但該頁仍顯示hello。只有在我重新加載Apache後,頁面纔會顯示world

在使用phusion-passenger之前,我使用mod_ruby和apache。如果我沒有記錯,我不需要重新啓動Apache以獲取CGI變量來打印更新的值。

我沒有被困在需要使用CGI。我只是想能夠抓住查詢字符串參數,而不必每次都重新加載Apache。

我沒有使用rails或Sinatra,因爲我只是試圖圍繞Ruby語言包裹我的頭,以及與Apache有什麼關係。

+0

「我不使用導軌或Sinatra的,因爲我只是想環繞Ruby語言我的頭以及什麼與apache phusion-passenger是關於。「那麼你真的會遇到困難。我們很少使用Rack,我們使用Sinatra,Padrino或Rails,並將Rack視爲大多數簡單事物的不可見層,當我們需要混淆HTTPd和控制層之間的數據流時,Rack變得有用。 Ruby不是Rack,Rack是HTTPd和Ruby控制層之間的中間件,就像Sinatra一樣。 – 2014-10-16 22:31:49

回答

0

IMO這種行爲是有道理的。由於$tpl在文件加載時僅設置一次,因此在提供第一個請求時會發生什麼情況。之後 - 在以下請求中 - 僅調用proc,但不會再更改$tpl

而不是使用純CGI的,我會用一個非常簡單的應用程序Rack做到這一點:

require 'rack' 
require 'rack/server' 

class Server 
    def self.call(env) 
    req = Rack::Request.new(env) 
    tpl = "#{req.params['myvar']}.rb" 
    [200, {}, [tpl]] 
    end 
end 

run Server 
+0

好的謝謝。我一直在proc內部嘗試,但它仍然保留了我第一次加載頁面的價值。你能想到其他的想法嗎?最後,我的目標是每次通過url傳遞不同的變量到我的ruby腳本 – John 2014-10-16 20:20:28

+0

我更新了我的答案。我的第一次訴訟並沒有解決問題。它只是將它移動到另一行,因爲'proc'也是在服務器啓動時定義的。 – spickermann 2014-10-16 20:37:00

+0

我剛剛嘗試過您的代碼的lambda版本,仍然是同一個問題。我真的需要學習機架嗎?我只是想讓Sinatra工作而不知所措 – John 2014-10-16 20:43:43