2010-12-19 23 views
3
def call(env) 
    status, headers, response = @app.call(env) 

    if response.is_a? Array 
     puts response.inspect 
    else 
     puts response.class.to_s 
    end 

    [status, headers, response] 
    end 

從development.log:Rails3中機架響應 - 未定義的方法response.body

第一請求:

Completed 200 OK in 95ms (Views: 35.9ms | ActiveRecord: 1.5ms) 
ActionDispatch::Response 

第二和其他請求:

Completed 200 OK in 77ms (Views: 76.3ms | ActiveRecord: 0.0ms) 
[] 

響應是: ActionDispatch::Response第一次路由被調用, 對於任何其他請求的確切url,它是一個空的Array

在兩種情況下頁面呈現都成功,但當響應是空數組時,我不能使用response.body

這是正常的Rails行爲?即使在開發環境中,這裏是否有緩存?

回答

1

我看到同樣的事情。

我發現,控制檯只會顯示最後一個HTTP狀態代碼(200 OK),但與調試器控制檯我看到一個不同的代碼(304,「不修改」。More on that here

的性質304代碼是響應將是空的,因爲服務器告訴您的瀏覽器只使用緩存。你的瀏覽器正在發送一個條件GET(這應該是普通的瀏覽器行爲?),這就是導致你的服務器行爲的原因。你的瀏覽器不知道你處於開發模式,所以它會像往常一樣運行。

請注意,我可以通過對CTRL-F5進行刷新(在Firefox中)來避開此錯誤,該命令是「刷新並忽略緩存」的命令。所以瀏覽器會做一個簡單的GET,而不是一個有條件的GET。

下面是我用來幫助我弄清楚發生了什麼的代碼(需要ruby-debug寶石)。

def call(env) 
    status, headers, response = @app.call(env) 
    debugger 
    if headers["Content-Type"].include?("text/html") 
    [status, headers, "<!--hello world! -->" + response.body] 
    else 
    [status, headers, response] 
    end 
end 

這樣做後,加載頁面,並在rail server終端:

(rdb:1) irb 
irb(#<PostRedirect:0x7f9c6292a530>):001:0> status 
=> 304 

我的修復是添加一個狀態代碼檢查:

if (status != 304) && headers["Content-Type"].include?("text/html") 
+0

你是對的,我想「電子標籤」標題導致304狀態。 – Mirko 2011-05-25 23:09:48

+1

是的,這聽起來是正確的。我認爲大多數網站現在應該支持eTag標題,因爲它節省了帶寬,並允許更快的頁面加載,如果該網站沒有更早的訪問。這就是說,對於小型網站來說它並沒有什麼區別,並且在開發模式中可能並不明顯(因爲您的頁面請求的延遲幾乎爲零) – 2011-05-26 00:40:08

相關問題