Rails 3当前将HEAD请求路由到匹配的GET路由。有一个头?方法在请求中,但是返回false并且请求的行为就像获取请求一样。我可以检测到请求是否是HEAD请求?Rails 3中的HEAD HTTP请求
推理:我得到一个HEAD请求应该返回与get相同的头文件,所以Rails想要执行完整的GET,然后删除正文。但是,我可以遵守这个请求,而不会发出GET所要求的相同的数据库调用等。这有意义吗?
Rails 3当前将HEAD请求路由到匹配的GET路由。有一个头?方法在请求中,但是返回false并且请求的行为就像获取请求一样。我可以检测到请求是否是HEAD请求?Rails 3中的HEAD HTTP请求
推理:我得到一个HEAD请求应该返回与get相同的头文件,所以Rails想要执行完整的GET,然后删除正文。但是,我可以遵守这个请求,而不会发出GET所要求的相同的数据库调用等。这有意义吗?
您可以使用request.head?方法找出如果它是一个HEAD请求:
http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-head-3F
一旦你确定它就是,你也可以使用控制器的头()方法,而不是典型的渲染:
http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses
所以我只是检查request.head?在打扰数据库活动之前。然后使用
head :ok, :custom_header => 'value'
所以,这里有一些[更多信息](https:/ /gist.github.com/2594991)您可以看到HEAD被路由到GET我的Rails,此时请求表示它是一个GET。我试过了头?,但无法表明它是HEAD请求。 –
def index
if request.head?
head :created
else
Rails.logger.info "Derp #{request.method}"
end
end
嗯。上面的控制器方法就像我期望的那样在Ruby v1.9.3-p194和Rails v3.2.3上运行; 201的无响应正文为HEAD请求,200响应为GET。
我在1.9.2和Rails 3.1.4上......我完全准备好做错了。我将不得不进一步调查......谢谢。 –
所以,我认为真正的答案是,rails通过处理GET的相同操作强制HEAD请求是B/c它必须生成ETag。如果HEAD做了一些不同的事情,它会(可能)破坏客户端缓存。因此,确切的电话必须发出.... 我不喜欢,我不能真正使用头?知道这是一个HEAD请求,但我(想我)理解这个推理。 –
我有这个确切的问题。事实证明,启用缓存导致了这一点。在你的环境中关闭缓存和#head?将按预期工作。
问题是Rack :: Cache将HEAD请求转换为GET请求,以便它们可以被缓存。这可以说是正确的行为,但它干扰了我的申请。
您可能需要张贴一些相关的代码。头部?方法应该为HEAD请求返回true(http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-head-3F) – rjk