首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails检查"If-Modified-Since“的请求头

Rails检查"If-Modified-Since“的请求头
EN

Stack Overflow用户
提问于 2012-10-11 13:28:23
回答 3查看 4.8K关注 0票数 1

我正在尝试使用Rails构建一个应用程序接口,它将检查"If-Modified-Since"request标头,并仅呈现在该日期之后修改过的对象。问题是我在尝试从控制器的请求头获取值时被卡住了。

代码语言:javascript
复制
# API
def index
   @products = Product.where{updated_at > request.headers["If-Modified-Since"]}
   render "v1/products/index"
end

从请求头提取值的正确方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-11 13:53:20

首先:If-Modified-Since用于HTTP cache验证。,请不要这样使用它。请改用参数。

回答你的问题:request.headers[]是访问请求头的正确方式。作为参考,request是一个ActionDispatch::Request对象。

这里的问题是您如何尝试表达约束。您正在将一个块传递到ActiveRecord#where方法中,但是该块没有任何意义(Symbol#>(String)?)。

代码语言:javascript
复制
Product.where("updated_at > ?", params[:last_update])

或者,您也可以直接使用Squeel,并编写:

代码语言:javascript
复制
Product.where{ updated_at > params[:last_update] }
票数 5
EN

Stack Overflow用户

发布于 2013-11-14 13:31:56

根据W3规范,您使用If-Modified- valid的方法是完全有效的。[1]这里的其他响应者说它是非标准的或会损坏您的缓存,这是不正确的。它不是非常RESTful,并且不推荐在数据中包含状态信息(比如GET参数)。

为了回答你的问题,你可以使用stale?来生成一个304 (如果它没有被修改)或者生成实际的内容。下面是一个例子:

代码语言:javascript
复制
def index
  if_modified_since = request.headers['If-Modified-Since'] || DateTime.new
  @items = Item.where("updated_at > ?", if_modified_since).order(updated_at: :desc)
  if stale?(@items.first)
    render json: @items
  end
end

请注意,这里假设@items总是包含一个项目。如果它不总是返回某些东西,您可以根据自己的需要对其进行定制。

票数 3
EN

Stack Overflow用户

发布于 2012-10-11 13:51:18

request.if_modified_sincerequest.headers["HTTP_IF_MODIFIED_SINCE"]

请注意,这是标头的非标准用法。它通常是指页面的任何内容在If-Modified- page中指定的时间后是否发生了更改,而不是页面应该只包含已更改的内容。

您可能还会对stale?方法感兴趣。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12832791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档