ruby-on-rails - 如何使用 Enumerize 验证数组的存在?

标签 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.

它似乎在其他一些情况下有效(例如,当您提供不在枚举中的非空字符串时)。例如

# 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/

相关文章:

ruby - 为什么喜欢使用 %w 而不是 ['foo'、 'bar']

ruby-on-rails - 如何从 Rabl 模板内的 enumerize 获取整数值?

ruby-on-rails - 在Redmine插件中通过alias_method_chain包装类方法

ruby-on-rails - Ruby:使用私钥/公钥进行文件加密/解密

javascript - 使用 jQueryUI Datepicker 根据特定日期请求 Rails View

ruby-on-rails - 如何使用 Grape 和 MongoDB 在 Ruby on Rails 中正确测试 'post'(创建)方法

ruby-on-rails - 为什么我的与时间相关的单元测试每天下午 4 点中断?

ruby-on-rails - Rails 3.0 中的 f.error_messages