【问题标题】:rails serialized array validationrails 序列化数组验证
【发布时间】:2014-07-22 08:14:31
【问题描述】:

我需要验证保存在 email_list 中的电子邮件。对于验证,我有 EmailValidator。但我无法弄清楚如何在一对 validates_each 中使用它。还有其他方法可以进行验证吗?

class A < ActiveRecord::Base
  serialize :email_list
  validates_each :email_list do |r, a, v|
    # what should it be here? 
    # EmailValidator.new(options).validate_each r, a, v
  end
end

【问题讨论】:

  • :email_list 是一个包含电子邮件的数组,您想确保每封电子邮件都是有效的还是什么?
  • 是的,完全正确。如果有人无效,我需要验证每封电子邮件并添加错误
  • @gwcoffey 提供的答案似乎可以做到这一点。
  • 主要难度与'if'条件有关。我不知道如何在这里使用 EmailValidator

标签: ruby-on-rails validation activerecord serialization activemodel


【解决方案1】:

validates_each 用于验证多个属性。在您的情况下,您有一个属性,您需要以自定义方式对其进行验证。

这样做:

class A < ActiveRecord::Base
   validate :all_emails_are_valid

   ...

   private
   def all_emails_are_valid
      unless self.email_list.nil?
         self.email_list.each do |email|
            if # email is valid -- however you want to do that
               errors.add(:email_list, "#{email} is not valid")
            end
         end
      end
   end
end

请注意,您也可以为此制作自定义验证器,或将验证放入 validate 调用的 proc 中。见here

这是一个带有自定义验证器的示例。

class A < ActiveRecord::Base

  class ArrayOfEmailsValidator < ActiveModel::EachValidator
    def validate_each(record, attribute, value)
      return if value.nil?
      value.each do |email|
        if # email is valid -- however you want to do that
          record.errors.add(attribute, "#{email} is not valid")
        end
      end
    end
  end

  validates :email_list, :array_of_emails => true

  ...

end

当然,您可以将ArrayOfEmailsValidator 类放入,即lib/array_of_emails_validator.rb 并将其加载到您需要的地方。这样您就可以在模型甚至项目之间共享验证器。

【讨论】:

  • 我坚持 if 条件),它可以用 EmailValidator 做什么?
  • 我添加了第二个自定义验证器示例
  • 谢谢。但我仍然找不到使用 EmailValidator 的方法。因为它可能有复杂的逻辑,不能直接插入到 ArrayOfEmailsValidator 中。是否可以详细编写'if'代码?
【解决方案2】:

我最终得到了这个: https://gist.github.com/amenzhinsky/c961f889a78f4557ae0b

您可以根据rails guide编写自己的EmailValidator,并使用ArrayValidatorlike:

validates :emails, array: { email: true }

【讨论】:

    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多