我尝试使用Enumerize Gem在给定的模型数组字段上实现验证。我想:
validates :field, presence: true
)当我提供包含空字符串的列表时,状态验证器似乎失败了。见这个例子。
class MyModel
include ActiveModel::Model
extend Enumerize
enumerize :cities, in: %w(Boston London Berlin Paris), multiple: true
validates :cities, presence: true
end
# Does not behave as expected
a = MyModel.new(cities: [""])
a.cities.present? # => false
a.valid? # => true, while it should be false.
它似乎适用于其他一些情况(例如,当您提供不在Enum中的非空字符串时)。例如
# Behaves as expected
a = MyModel.new(cities: ["Dublin"])
a.cities.present? # => false
a.valid? # => false
是否有可用的解决方法可以同时使用Enumerize验证和ActiveModel状态验证?
谢谢!
答案 0 :(得分:3)
enumerize
gem将多个值保存为字符串数组。这样的事情:"[\"Boston\"]"
。所以,使用空数组,您可以:"[]"
。 presence
验证程序使用blank?
方法检查值是否存在。 "[]".blank?
显然会返回false
。
所以,你可以尝试一些替代方案:
validates :cities, inclusion: { in: %w(Boston London Berlin Paris) }
添加自定义验证程序
validate :ensure_valid_cities
def ensure_valid_cities
errors.add(:cities, "invalid") unless cities.values.empty?
end
答案 1 :(得分:1)
这实际上是一个错误,应该在Enumerize的更高版本中修复(参见https://github.com/brainspec/enumerize/pull/226)。
与此同时,您可以使用自定义验证器作为解决方法(请参阅Leantraxx的答案)。