2012-06-15 2 views
0

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

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 находится на контроллере_a # a, а b.html.erb - на контроллере_b # b. Оба действия кэшируются caches_action. Как я могу убедиться, что когда я меняю ключ перевода some.key, оба вида аннулируются? Как я могу создать общий механизм?

ответ

3

Скажем, в вашем 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.

Docs on cache_path.

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

+0

Итак, это предполагает, что все ключи в представлении имеют один и тот же префикс? – Geo

+0

@Tempus Обновлено. Теперь вы можете передавать несколько областей. – jdoe

+0

Спасибо! Это очень остроумное решение! – Geo

Смежные вопросы