Как можно сделать кэш для просмотров с переводами недействительным?

Представьте, что у вас есть два представления с кодом, подобным следующему:

controller_a/a.html.erb

  <%= content_tag(:div) do %>
     <%= I18n.t "some.key" %>
  <% end %>

controller_b/b.html.erb

  <%= content_tag(:div) do %>
     <%= I18n.t "some.key" %>
  <% end %>

  <%= content_tag(:div) do %>
     <%= I18n.t "some.other_key" %>
  <% end %>

Так,a.html.erb находится на controller_a # a, аb.html.erb находится на controller_b # b. Оба действия кэшируютсяcaches_action, Как я могу убедиться, что когда я меняюsome.key ключ перевода, оба представления признаны недействительными? Как я мог построить общий механизм?

Ответы на вопрос(1)

Решение Вопроса

Скажем, в твоемApplicationController создать следующий класс-метод (или в lib иextend по ней)

def self.i18n_digest(*scopes)
    Digest::MD5.hexdigest I18n.t(scopes).to_s
end

Тогда вы можете использовать:cache_path вариант в вашемcaches_action сюда:

caches_action :some_action, cache_path: { some_key: i18n_digest('some', 'foo') }

Просто убедитесь, что вы установили локаль вbefore_filter до этого заявления.

Документы наcache_path.

Note: Я использую объем перевода ('some') получить все вложенные сообщения в виде хэша.

 15 июн. 2012 г., 20:42
@Tempus Обновлено. Теперь вы можете передать несколько областей.
 15 июн. 2012 г., 22:10
@Tempus Кстати, я вспомнил, что I18t может принимать массив ключей и возвращать массив хэшей. Теперь вам не нужно дажеmap {...}, Смотрите другое обновление :-)
 Geo15 июн. 2012 г., 20:19
Таким образом, это предполагает, что все ключи в представлении имеют одинаковый префикс?
 Geo15 июн. 2012 г., 21:48
Спасибо! Это очень оригинальное решение!
 13 нояб. 2014 г., 13:25
Также лучше кэшировать i18n_digest, поскольку i18n влияет только на перезагрузку сервера, и мы можем использовать память приложения для кэширования этого кэша.

Ваш ответ на вопрос