2010-12-19 64 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