Ruby on rails 当区域设置更改时,如何使条件GET缓存过期?
对于JSON API,我使用如下(简化):Ruby on rails 当区域设置更改时,如何使条件GET缓存过期?,ruby-on-rails,caching,etag,Ruby On Rails,Caching,Etag,对于JSON API,我使用如下(简化): 类平衡控制器响应200 OK get/balances/mine,{},{“Accept Language”=>“en”,“If None Match”=>上一个\u响应。头文件[“ETag”]}#=>响应304未修改 get/balances/mine,{},{“Accept Language”=>“nl”,“If None Match”=>上一次的_响应。头文件[“ETag”]}#=>响应200 OK get/balances/mine,{},{“
类平衡控制器
这适用于ETags(如果不匹配)和更新的_at(如果修改自)
但是,我想使不同语言的缓存无效。简化:
class BalancesController < ApplicationController
def mine
fresh_when(current_user.balance)
end
end
class BalancesController < ApplicationController
before_action :set_locale
def mine
fresh_when(current_user.balance)
end
private
def set_locale
@locale = locale_from_headers
end
end
类平衡控制器
来自_headers的locale\u是一个更复杂的库,但对于本例来说,可以说header的“Accept Language:nl”
或的“Accept Language:en”
将导致@locale
成为:nl
或:en
我想在etag中使用它,如果从那时起进行了修改。因此,当请求其他语言时,fresh_when不会返回缓存响应。像这样:
get/balances/mine,{},{“接受语言”=>“en”}
#=>响应200 OK
get/balances/mine,{},{“Accept Language”=>“en”,“If None Match”=>上一个\u响应。头文件[“ETag”]}
#=>响应304未修改
get/balances/mine,{},{“Accept Language”=>“nl”,“If None Match”=>上一次的_响应。头文件[“ETag”]}
#=>响应200 OK
get/balances/mine,{},{“Accept Language”=>“nl”,“If None Match”=>先前的_响应。头文件[“ETag”]}
#=>响应304未修改
因此,只有当区域设置与缓存版本匹配时,响应才会被缓存并返回为304
使用cache()
块,在Rails中使用片段缓存。
当使用方法时,如何使用新鲜的\u实现同样的效果?解决方案很简单。但仅适用于etags方法:
class BalancesController < ApplicationController
etag { current_locale }
def mine
fresh_when(etag: current_user.balance)
end
private
def current_locale
@locale ||= locale_from_headers
end
end
类平衡控制器
如果修改自
使用如果自方法修改,则不可能使缓存过期。因为Rails在使用条件GET
时不存储任何缓存,而只将传入的时间戳与对象上的时间戳进行比较
这两个网站都没有能力承载比“仅仅是一次约会”更多的信息。我们需要rails来存储它的缓存(就像片段缓存一样),以便同时存储为其创建的语言。此方法不允许我们根据语言标头使缓存过期
通过仅传递etag
选项,将忽略if-modified-since头:fresh\u when(etag:current\u user.balance)
如果没有匹配
这表示一个实体标记,是所服务内容的标识符。通常,这是使用返回对象的对象id构建的
条件Get允许额外的etag生成器,名为etagger
这可用于将额外信息添加到实体标记中 解决方案很简单。但仅适用于etags方法:
class BalancesController < ApplicationController
etag { current_locale }
def mine
fresh_when(etag: current_user.balance)
end
private
def current_locale
@locale ||= locale_from_headers
end
end
类平衡控制器
如果修改自
使用如果自方法修改,则不可能使缓存过期。因为Rails在使用条件GET
时不存储任何缓存,而只将传入的时间戳与对象上的时间戳进行比较
这两个网站都没有能力承载比“仅仅是一次约会”更多的信息。我们需要rails来存储它的缓存(就像片段缓存一样),以便同时存储为其创建的语言。此方法不允许我们根据语言标头使缓存过期
通过仅传递etag
选项,将忽略if-modified-since头:fresh\u when(etag:current\u user.balance)
如果没有匹配
这表示一个实体标记,是所服务内容的标识符。通常,这是使用返回对象的对象id构建的
条件Get允许额外的etag生成器,名为etagger
这可用于将额外信息添加到实体标记中