Rails 3中的HEAD HTTP请求

Rails 3当前将HEAD请求路由到匹配的GET路由。 有头吗? 请求的方法,但返回false,请求就像一个get请求。 我可以检测请求是否是HEAD请求?

推理:我得到一个HEAD请求应该返回与get相同的标题,因此Rails想要执行完整的GET然后剃掉正文。 但是,我可以符合此请求,而不会发出GET会发出的相同数据库调用等。 这有意义吗?

我有这个问题。 事实certificate,启用缓存会导致这种情况。 在您的环境和#head中关闭缓存? 将按预期工作。

问题是Rack :: Cache将HEAD请求转换为GET请求,因此可以缓存它们。 这可以说是正确的行为,但它干扰了我的应用程序。

你可以使用request.head? 找出它是否是HEAD请求的方法:

http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-head-3F

一旦确定它是,你也可以使用控制器的head()方法而不是典型的渲染:

http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses

所以我只需检查request.head? 在烦扰数据库活动之前。 然后用

head :ok, :custom_header => 'value' 
 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的w /的GET。