Ruby on rails 在Rails 3中处理HTTP请求

Ruby on rails 在Rails 3中处理HTTP请求,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,Rails 3当前将HEAD请求路由到匹配的GET路由。有头吗?方法,但在中返回false,请求的行为类似于get请求。我是否可以检测该请求是否为HEAD请求 推理:我知道HEAD请求应该返回与get完全相同的头,所以Rails希望执行完整的get,然后剃掉身体。但是,我可以遵循这个请求,而不发出GET将发出的相同DB调用等。这有意义吗?您可以使用request.head?方法来确定它是否是HEAD请求: 一旦确定是,还可以使用控制器的head()方法,而不是典型的渲染: 所以我只需要检查一

Rails 3当前将HEAD请求路由到匹配的GET路由。有头吗?方法,但在中返回false,请求的行为类似于get请求。我是否可以检测该请求是否为HEAD请求


推理:我知道HEAD请求应该返回与get完全相同的头,所以Rails希望执行完整的get,然后剃掉身体。但是,我可以遵循这个请求,而不发出GET将发出的相同DB调用等。这有意义吗?

您可以使用request.head?方法来确定它是否是HEAD请求:

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

所以我只需要检查一下请求。头?在处理数据库活动之前。然后使用

head :ok, :custom_header => 'value'

嗯,上面的控制器方法就像我在Ruby v1.9.3-p194和Rails v3.2.3上期望的那样工作;201的不带响应主体的HEAD请求和200的不带响应主体的GET请求。

我有一个确切的问题。事实证明,启用缓存会导致这种情况。在您的环境中关闭缓存,然后#开始?将按预期工作


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

您可能需要发布一些相关代码。头?方法应该为HEAD请求()返回true,因此,这里有一些要点,您可以看到HEAD被路由到GET my Rails,此时请求表示它是GET。我尝试了head?,但无法让它表明这是head请求。我使用的是1.9.2和Rails 3.1.4…我完全准备好做错事。我还需要进一步调查……谢谢。所以,我认为真正的答案是rails通过处理GET的相同操作强制HEAD请求,它必须生成ETag。若HEAD做了一些不同的事情,它(很可能)会破坏客户端缓存。因此,必须发出准确的电话。。。。我不喜欢这样我真的不能用头?我想知道这是一个头部的要求,但我(认为我)理解的理由。
def index
  if request.head?
    head :created
  else
    Rails.logger.info "Derp #{request.method}"
  end
end