Истекающий / уничтожающий Etag в Rails
При выполнении HTTP-кэширования в рельсах, однажды будет использовать:
fresh_wen etag: @user, public: true
Проблема в том, что если вы предоставите свой HTML для страницы, кэшированная страница больше не будет действительной. Поэтому нам нужен способ аннулировать страницу /etag каждый раз, когда мы что-то меняем.
Один из способов сделать это - изменять RAILS_CACHE_ID каждый раз, когда вы развертываете, как в случае с развертыванием Etag при развертывании. Однако это приведет ко всем etag, для всех страниц, срок действия которых истекает для каждого развертывания.
Я предпочел бы иметь решение, где я могу истечь отдельные теги, для отдельных страниц.
Я мог бы создать свой собственный etag с такой версией: fresh_when etag: (@user.updated_at.to_s + "V1"), public: true
Но это не похоже на "путь рельсов". Есть более элегантные решения?
2 ответа
В этой статье есть обновление с соответствующей библиотекой, так что вы можете просто установить версию в конфигурации. Смотрите README на https://github.com/n8/bust_rails_etags
Если вы используете Capistrano или стратегию развертывания, где Rails.root
Изменения значений при каждом развертывании, вы можете добавить это к вашему контроллеру приложений:
class ApplicationController < ActionController::Base
# This causes http request caching to expire when we deploy.
# The app is deployed /mnt/code/releases/<timestamp>
etag { $etag_cache_control_fragement ||= Rails.root.to_s.split("/").last }
Ссылка здесь: http://api.rubyonrails.org/v5.1/classes/ActionController/ConditionalGet/ClassMethods.html