Rails3 Rack响应 - 未定义的方法response.body

时间:2010-12-19 17:31:09

标签: ruby-on-rails-3 response rack

  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行为吗?即使在开发环境中也有一些缓存吗?

1 个答案:

答案 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")