对于一个控制器(仅限),我想使用在rails缓存逻辑之外生成的ETag值,并自己管理304-vs-200响应。似乎我没有做任何设置ETag标头的工作:
response.etag = myEtag
headers['ETag'] = myEtag
render :text => myText, :etag => myEtag
Rails总是使用自己的版本。
我知道我可以在应用范围内禁用缓存,但我不想要 - 只想在一个ActionController
子类的响应中覆盖它。
答案 0 :(得分:0)
fresh_when
等不太适合我的需求 - 在我的情况下解决方案是拒绝缓存
def caching_allowed?
false
end
然后在我的响应中设置只是 headers['ETag']
成员 - 设置任何.etag
选项似乎会导致Rails到MD5所有事情。
答案 1 :(得分:0)
此外,如果您想直接覆盖它,则可以如下设置etag值:
headers['ETag'] = 'xxxxxx'
Rack的代码参考 ( rack-1.6.11 / lib / rack / etag.rb )
if etag_status?(status) && etag_body?(body) && !skip_caching?(headers)
original_body = body
digest, new_body = digest_body(body)
body = Rack::BodyProxy.new(new_body) do
original_body.close if original_body.respond_to?(:close)
end
headers[ETAG_STRING] = %(W/"#{digest}") if digest
end
private
def skip_caching?(headers)
(headers[CACHE_CONTROL] && headers[CACHE_CONTROL].include?('no-cache')) ||
headers.key?(ETAG_STRING) || headers.key?('Last-Modified')
end