Ruby on rails 如何使具有翻译的视图的缓存无效?
假设您有两个视图,其代码如下所示: controller\u a/a.html.erbRuby on rails 如何使具有翻译的视图的缓存无效?,ruby-on-rails,caching,internationalization,Ruby On Rails,Caching,Internationalization,假设您有两个视图,其代码如下所示: controller\u a/a.html.erb <%= content_tag(:div) do %> <%= I18n.t "some.key" %> <% end %> <%= content_tag(:div) do %> <%= I18n.t "some.key" %> <% end %> <%= content_tag(:di
<%= content_tag(:div) do %>
<%= I18n.t "some.key" %>
<% end %>
<%= content_tag(:div) do %>
<%= I18n.t "some.key" %>
<% end %>
<%= content_tag(:div) do %>
<%= I18n.t "some.other_key" %>
<% end %>
controller_b/b.html.erb
<%= content_tag(:div) do %>
<%= I18n.t "some.key" %>
<% end %>
<%= content_tag(:div) do %>
<%= I18n.t "some.key" %>
<% end %>
<%= content_tag(:div) do %>
<%= I18n.t "some.other_key" %>
<% end %>
因此,
a.html.erb
在控制器a上,而b.html.erb
在控制器b上。这两个操作都由缓存\u action
缓存。如何确保在更改some.key
translation键时,两个视图都无效?如何构建通用机制?例如,在应用程序控制器中创建以下类方法(或在库中并通过它扩展):
然后,您可以通过以下方式在缓存操作中使用:缓存路径
选项:
caches_action :some_action, cache_path: { some_key: i18n_digest('some', 'foo') }
只需确保在此语句之前设置了一个before\u filter
注意:我正在使用翻译范围('some'
)将其所有嵌套消息作为散列获取。比如,在应用程序控制器中创建以下类方法(或在库中并通过它扩展):
然后,您可以通过以下方式在缓存操作中使用:缓存路径
选项:
caches_action :some_action, cache_path: { some_key: i18n_digest('some', 'foo') }
只需确保在此语句之前设置了一个before\u filter
注意:我正在使用转换范围('some'
)将其所有嵌套消息作为散列获取。因此这假设视图中的所有键都具有相同的前缀?@Tempus Updated。现在您可以通过多个范围。谢谢!这是一个非常巧妙的解决方案@顺便说一下,我记得I18t可以接受一个键数组并返回一个哈希数组。现在您甚至不需要映射{…}
。请参阅另一个更新:-)另外,最好缓存i18n_摘要,因为i18n只是服务器重新加载时的更改,我们可以使用应用程序内存缓存此缓存。因此,这假设视图中的所有键都具有相同的前缀?@Tempus Updated。现在您可以通过多个范围。谢谢!这是一个非常巧妙的解决方案@顺便说一下,我记得I18t可以接受一个键数组并返回一个哈希数组。现在您甚至不需要映射{…}
。请参阅另一个更新:-)另外,最好缓存i18n_摘要,因为i18n只是服务器重新加载时的更改,我们可以使用应用程序内存缓存此缓存。