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:
第一次请求:
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
第一次调用路由时,
对于该确切网址的任何其他请求,它是一个空的Array
在两种情况下,页面呈现都成功,但当响应为空数组时,我无法使用response.body
。
这是正常的Rails行为吗?即使在开发环境中也有一些缓存吗?
答案 0 :(得分: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")