Ruby on rails 当区域设置更改时,如何使条件GET缓存过期?

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,{},{“

对于JSON API,我使用如下(简化):

类平衡控制器
这适用于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

这可用于将额外信息添加到实体标记中