【发布时间】:2012-03-05 00:04:51
【问题描述】:
我刚刚意识到在控制器中设置语言环境的推荐 Rails 方法
before_filter :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
全局设置区域设置。上面的代码有效,但我想知道default_locale 是否真的是默认的,如果你必须显式键入它?
我希望每个请求都有一个语言环境(就像我们每个请求都有会话)并执行以下操作:
def set_locale
locale = params[:locale] if params[:locale]
end
否则默认使用I18n.default_locale。这将理想地匹配路径中的可选语言环境:
# config/routes.rb
scope "(:locale)", :locale => /en|nl/ do
resources :books
end
现在,如果由于某种原因我在某些操作中跳过了区域设置,它会使用上一个请求中设置的区域设置,该请求可能来自另一个用户!
是否存在潜在的竞争条件,因为一个请求可以更改全局 I18n.locale,而另一个请求(预先设置了另一个语言环境)正在呈现过程中?
更新:我现在从 I18n 文档中找到了一些细节:
伪全局设置当前语言环境,即在 Thread.current 哈希中 def locale=(地区)
现在我想了解每个请求是否都是一个单独的线程。
更新 2:请参阅我的答案以获得解释。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 localization internationalization