我正在尝试使用Rails构建一个应用程序接口,它将检查"If-Modified-Since"的request标头,并仅呈现在该日期之后修改过的对象。问题是我在尝试从控制器的请求头获取值时被卡住了。
# API
def index
@products = Product.where{updated_at > request.headers["If-Modified-Since"]}
render "v1/products/index"
end从请求头提取值的正确方法是什么?
发布于 2012-10-11 13:53:20
首先:If-Modified-Since用于HTTP cache验证。,请不要这样使用它。请改用参数。
回答你的问题:request.headers[]是访问请求头的正确方式。作为参考,request是一个ActionDispatch::Request对象。
这里的问题是您如何尝试表达约束。您正在将一个块传递到ActiveRecord的#where方法中,但是该块没有任何意义(Symbol#>(String)?)。
Product.where("updated_at > ?", params[:last_update])或者,您也可以直接使用Squeel,并编写:
Product.where{ updated_at > params[:last_update] }发布于 2013-11-14 13:31:56
根据W3规范,您使用If-Modified- valid的方法是完全有效的。[1]这里的其他响应者说它是非标准的或会损坏您的缓存,这是不正确的。它不是非常RESTful,并且不推荐在数据中包含状态信息(比如GET参数)。
为了回答你的问题,你可以使用stale?来生成一个304 (如果它没有被修改)或者生成实际的内容。下面是一个例子:
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总是包含一个项目。如果它不总是返回某些东西,您可以根据自己的需要对其进行定制。
发布于 2012-10-11 13:51:18
request.if_modified_since或request.headers["HTTP_IF_MODIFIED_SINCE"]
请注意,这是标头的非标准用法。它通常是指页面的任何内容在If-Modified- page中指定的时间后是否发生了更改,而不是页面应该只包含已更改的内容。
您可能还会对stale?方法感兴趣。
https://stackoverflow.com/questions/12832791
复制相似问题