我正在努力进行以下包含验证,
class User < ActiveRecord::Base
attr_accessible :language
validates :language, :presence => true, :inclusion => { :in => I18n.available_locales.join(' ')}
end
如果我在控制台中运行它,
u = User.new
u.valid?
然后我TypeError: can't convert nil into String
在include?
.active_model/validations/inclusion.rb
但是,如果我将验证行更改为,
validates :language, :presence => true, :inclusion => { :in => %(en fr es)}
然后验证按预期工作。如果 language 为 nil 或不是您所期望的列表中的条目之一并且没有崩溃,则它是无效的。
我已经通过代码来验证它是否可以生成包含列表,它就是这样。那么它为什么会崩溃呢?存在验证不应该解决问题并阻止任何进一步的验证吗?为什么当我生成列表而不是硬编码值时它会崩溃?
我什至尝试使用 proc 形式:in
来查看是否有任何区别,但它没有。但后来我真的没想到需要这样做,因为我只想在应用程序加载时生成一次列表,因为 I18n.available_locales 在应用程序执行期间永远不会改变。
更新:我有一个想法并测试了以下代码,
class User < ActiveRecord::Base
attr_accessible :language
validates :language, :presence => true, :inclusion => { :in => ['en','fr','es'].join(' ') }
end
这段代码也会产生同样的错误,所以问题不在于 I18n 或类似的东西。%(en fr es)
它与和之间的差异有关['en','fr','es'].join(' ')
。