我启用了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以来我看到的唯一变化就是这里。
我在这里和那里试图解决它。有什么想法吗?