2012-06-15 34 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在controller_a#a上,而b.html.erb在controller_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