验证Rails 4.0中I18n的包含失败

时间:2014-12-29 02:59:45

标签: ruby-on-rails ruby validation activerecord internationalization

我有以下型号。

class Ingredient < ActiveRecord::Base
  UNITS = [
            { name: "Unit" },
            { name: "Teaspoon" }
  ]
  validates :unit, inclusion: UNITS.map{|u| I18n.t(u[:name]) }
end

在控制台中。在语言环境if:fr(french)时运行以下命令,根据我的语言环境文件生成以下命令。

#Ingredient::UNITS.map{ |u| I18n.t(u[:name]) }
["Unité","Cuillère à café",]

哪个是正确的,但是当我执行以下操作时,验证失败了。

Ingredient.create(quantity: 4.0, unit: "Cuillère à café")

当我手动检查单元是否包含在阵列中时,我得到了真实。为什么验证失败?适用于英语。

1 个答案:

答案 0 :(得分:2)

验证程序是在第一次加载类时定义的,以后不再更改。在您的示例中,这意味着

validates :unit, inclusion: UNITS.map{|u| I18n.t(u[:name]) }

评估为

validates :unit, inclusion: ['Unit', 'Teaspoon'] 

并且不会在以后的请求中更改为其他语言环境。

可能会在数组上分配一个lambda,如下所示:

validates :unit, inclusion: { in: proc { UNITS.map { |u| I18n.t(u[:name]) } } }