неверное значение ETag в тестовой и производственной среде
-
21-09-2019 - |
Вопрос
Я использую новое решение для кэширования Rails, как описано здесь.
Тот самый развитие окружающая среда работает нормально, но тест и производство отправляет неверный ETag
заголовок игнорирует параметр stale?
функция.
Вот соответствующая часть одного из моих контроллеров:
def index
@categories = Category.all
if stale?(:etag => @categories)
respond_to do |format|
format.html
format.xml { render :xml => @categories }
format.json { render :json => @categories }
end
end
end
Тот самый stale?
способ проведения ActionController::Base
называет fresh_when
метод, который устанавливает etag
из числа Response
объект, который имеет следующий код:
def etag=(etag)
if etag.blank?
headers.delete('ETag')
else
headers['ETag'] = %("#{Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))}")
end
end
Тот самый Category
модель отправляет правильные cache_key
если я получу это в любой среде:
>> Category.find(1).cache_key
=> "categories/1-20100117153353"
>> ActiveSupport::Cache.expand_cache_key(Category.find(:all))
=> "categories/1-20100117153353/categories/2-20100117152007/categories/3-20100116094423/categories/4-20100116094423/categories/5-20100116094423/categories/6-20100116094423/categories/7-20100116094423/categories/8-20100117145800/categories/9-20100117145808"
Так что я просто не понимаю, что происходит, потому что когда я выбираю URL http://localhost:3000/admin/categories/
с помощью развитие окружающая среда, the ETag
меняется каждый раз, когда я экономлю на Category
но с тест или производство это не так.
Я проверил это с помощью вебрик и тонкий
Решение
решение состояло в том, что Category.all
метод кэшировал результаты на уровне класса, поэтому, как только он был извлечен, все было кэшировано для остальных запросов.
этого не было в развитие среде, потому что каждый раз, когда модель перезагружалась, потому что в этой среде config.cache_classes
был false
!
Другие советы
Я не знаю, есть ли максимум для строк заголовка / параметров, но при большом количестве категорий значение ETag становится очень длинным, как уже показывает ваш пример.
Вместо создания большой строки, содержащей все даты создания / изменения, вы могли бы найти последнюю дату изменения и использовать ее для ETag.
Более того статья, которую вы процитировали использование fresh?
вместо того, чтобы stale?
включая некоторые другие методы.Почему ты ими не пользуешься?
Редактировать: При просмотре статьи в вашем обновленная ссылка решение, по-видимому, состоит в том, чтобы заполнить только один @category
(то же, что и они).Следовательно , Найти последняя измененная категория
@category = Category.find(:first, :order => 'date DESC')
и используйте это значение для генерации MD5 для ETag.
Получите полный список @categories
только в том случае, если вы рендерите страницу.