如何使用Enumerize验证数组的存在?

时间:2016-07-05 16:07:29

标签: ruby-on-rails ruby enumerize

我尝试使用Enumerize Gem在给定的模型数组字段上实现验证。我想:

  • 使用Enumerize
  • 验证列表的所有元素是否属于给定子集
  • 验证列表不为空(使用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状态验证?

谢谢!

2 个答案:

答案 0 :(得分:3)

enumerize gem将多个值保存为字符串数组。这样的事情:"[\"Boston\"]"。所以,使用空数组,您可以:"[]"presence验证程序使用blank?方法检查值是否存在。 "[]".blank?显然会返回false

所以,你可以尝试一些替代方案:

选项1:

validates :cities, inclusion: { in: %w(Boston London Berlin Paris) }

选项2:

添加自定义验证程序

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的答案)。