Истекающий / уничтожающий 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

Другие вопросы по тегам