如何在Rails控制器响应中设置自定义ETag值?

时间:2012-05-14 15:34:06

标签: ruby-on-rails etag actioncontroller

对于一个控制器(仅限),我想使用在rails缓存逻辑之外生成的ETag值,并自己管理304-vs-200响应。似乎我没有做任何设置ETag标头的工作:

response.etag = myEtag
headers['ETag'] = myEtag
render :text => myText, :etag => myEtag

Rails总是使用自己的版本。

我知道我可以在应用范围内禁用缓存,但我不想要 - 只想在一个ActionController子类的响应中覆盖它。

2 个答案:

答案 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