我创建了一个功能,可以使用页面创建者的语言发布新闻。
以下是创建新闻的代码:
def add_news
locale = creator.language.blank? ? I18n.locale : creator.language
I18n.with_locale(locale) do
title = I18n.t('news.subject')
end
create_news({title: title})
end
它运作良好,新闻是用良好的语言创造的。但有时候会使用错误的语言。我已经阅读了i18n(https://github.com/svenfuchs/i18n/blob/master/lib/i18n.rb)的源代码,对我来说, with_local 函数不是线程安全的。我很惊讶,因为我没有读过关于那个问题的帖子。
那么,你觉得呢?线程安全与否?如果是这样,你知道其他解决方案吗?
谢谢,br,
埃里克
答案 0 :(得分:2)
看起来它来自Ruby on Rails guides,因为它使用的是Thread.current。
还进行了一项小型(结论性)实验:
n = I18n.available_locales.length
10.times do |i|
loc = I18n.available_locales[i % n]
Thread.new do
I18n.with_locale(loc) do
puts "#{loc} #{I18n.t 'one.of.your.keys'}"
end
end
end
答案 1 :(得分:0)
Thread.current
对于线程Web服务器(例如Puma或Thin)不是线程安全的。有关更多详细说明,请参见github.com/steveklabnik/request_store。