【问题标题】:Validates inclusion failing for I18n in Rails 4.0验证 Rails 4.0 中 I18n 的包含失败
【发布时间】:2014-12-29 02:59:44
【问题描述】:

我有以下型号。

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

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

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

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

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

当我手动检查该单元是否包含在数组中时,我得到了正确的结果。为什么此验证失败?适用于英语。

【问题讨论】:

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


    【解决方案1】:

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

    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]) } } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多