Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使具有翻译的视图的缓存无效?_Ruby On Rails_Caching_Internationalization - Fatal编程技术网

Ruby on rails 如何使具有翻译的视图的缓存无效?

Ruby 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

假设您有两个视图,其代码如下所示:

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(: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只是服务器重新加载时的更改,我们可以使用应用程序内存缓存此缓存。