我正在尝试使用 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.
它似乎在其他一些情况下有效(例如,当您提供不在枚举中的非空字符串时)。例如
# Behaves as expected
a = MyModel.new(cities: ["Dublin"])
a.cities.present? # => false
a.valid? # => false
是否有解决方法可以同时使用枚举验证和 ActiveModel 存在验证?
谢谢!
最佳答案
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
关于ruby-on-rails - 如何使用 Enumerize 验证数组的存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38208009/