Etag不再在Rails 5中工作了

时间:2016-11-06 07:55:47

标签: ruby-on-rails ruby-on-rails-5

我启用了Etag的缓存,如下所示:

def index
 if stale?(etag: @cards, last_modified: @cards.maximum(:updated_at))
  ...
 end
end

它适用于Rails 4,但在升级到Rails 5之后不再适用 - 总是返回200 OK和数据。

由于我使用的是机架,我还允许使用CORS标头:

config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'
    resource '*',
    headers: :any,
    methods: [:get, :post, :options, :patch, :delete],
    expose: ['ETag', 'If-Last-Modified', 'If-None-Match', 'Last-Modified']
  end
end

并且,这是我发送的示例请求(与Postman,终端有相同的问题):

curl -X GET -H "If-None-Match: W/\"1fdad4ffa4c02482942831ba43bd2f54\"" -H "Cache-Control: no-cache" -H "Postman-Token: 60cb1bfa-5a0b-19ee-6959-8463ff7aaefe" "http://localhost:3000/api/v1/mobile/cards"
谢谢你!

更新: 我发现了导致问题的原因。 问题是,当我得到一张卡片列表时,我会检查它们的有效性:

def set_cards
      @cards = Card.active(Time.now).approved.order(:id)
end

和'有效'范围是:

scope :active,  ->(time) { where("active = ? AND (expiration_date >= ? OR expiration_date IS NULL)", true, time) }

如果我从查询中删除它(或至少从expiration_date >= ?形成范围),一切正常,我按预期收到304。 我假设它与https://github.com/rails/rails/pull/15726有关,因为自从Rails 4以来我看到的唯一变化就是这里。

我在这里和那里试图解决它。有什么想法吗?

0 个答案:

没有答案