红宝石赛璐珞“环境”

时间:2016-04-15 08:46:36

标签: ruby-on-rails ruby celluloid

我对Celluloid很新,但我不明白为什么,在我的Rails应用程序中,我的期货失去了当前的语言环境:

puts "locale OUTSIDE #{I18n.locale}"
data.map do |item|
  Celluloid::Future.new { puts "locale INSIDE #{I18n.locale}"; serialize_item(item) }
end.map(&:value)

基本上我有点像

locale OUTSIDE en
locale INSIDE it
locale INSIDE it
locale INSIDE it
locale INSIDE it
locale INSIDE itlocale INSIDE it
locale INSIDE it

locale INSIDE it

locale INSIDE it

当我改变语言环境时,期货会继续考虑我的默认语言环境:它

我觉得我错过了一些基本的东西......

2 个答案:

答案 0 :(得分:2)

赛璐珞期货在一个单独的线程池中执行(不像某些答案所暗示的那样是一个不同的过程),

I18n.locale值存储在一个作用于各个线程http://www.rubydoc.info/docs/rails/2.3.8/I18n%2FConfig%3Alocale的变量中:

  

非全局且作用于线程的唯一配置值是:locale。它默认为default_locale。

意味着您在工作线程之外设置的配置不适用于工作线程。

你需要:

  1. 如果您希望将配置传播到流程中的所有工作线程,请使用I18n.default_locale,或者
  2. 将区域设置作为参数发送到将来并设置它(确保在确保块中再次清除它或者其他赛璐珞演员可能会发生有趣的事情)

答案 1 :(得分:0)

如果要使用区域设置,请将其作为参数传递给构造函数:

Celluloid::Future.new(locale = I18n.locale) { puts "locale INSIDE #{locale}" }

我相信该块将在新进程中执行,因此您的区域设置信息将丢失。

相关问题