2012-05-03 97 views
6

Rails 3当前将HEAD请求路由到匹配的GET路由。有一个头?方法在请求中,但是返回false并且请求的行为就像获取请求一样。我可以检测到请求是否是HEAD请求?Rails 3中的HEAD HTTP请求

推理:我得到一个HEAD请求应该返回与get相同的头文件,所以Rails想要执行完整的GET,然后删除正文。但是,我可以遵守这个请求,而不会发出GET所要求的相同的数据库调用等。这有意义吗?

+0

您可能需要张贴一些相关的代码。头部?方法应该为HEAD请求返回true(http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-head-3F) – rjk

回答

2

您可以使用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' 
+0

所以,这里有一些[更多信息](https:/ /gist.github.com/2594991)您可以看到HEAD被路由到GET我的Rails,此时请求表示它是一个GET。我试过了头?,但无法表明它是HEAD请求。 –

1
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。

+0

我在1.9.2和Rails 3.1.4上......我完全准备好做错了。我将不得不进一步调查......谢谢。 –

+0

所以,我认为真正的答案是,rails通过处理GET的相同操作强制HEAD请求是B/c它必须生成ETag。如果HEAD做了一些不同的事情,它会(可能)破坏客户端缓存。因此,确切的电话必须发出.... 我不喜欢,我不能真正使用头?知道这是一个HEAD请求,但我(想我)理解这个推理。 –

4

我有这个确切的问题。事实证明,启用缓存导致了这一点。在你的环境中关闭缓存和#head?将按预期工作。

问题是Rack :: Cache将HEAD请求转换为GET请求,以便它们可以被缓存。这可以说是正确的行为,但它干扰了我的申请。