回调与验证

时间:2011-07-06 22:57:17

标签: ruby-on-rails validation

我在创建新的Client对象时创建了一个回调,而不是使用validates_uniqueness_of验证方法,因为:

  • 我想找到已存在的客户端
  • 将现有客户端详细信息添加到我的基本错误消息

我的问题:有没有比我的解决方案更优雅的方式实现这一目标?

我有以下模型

class Client < ActiveRecord::Base
  before_validation_on_create :prevent_duplicate_clients

  private
    def prevent_duplicate_clients
      client = self.class.find(:all, :conditions => ["first_name = ? AND middle_name = ? AND last_name = ? AND date_of_birth = ?", self.first_name, self.middle_name, self.last_name, self.date_of_birth])

      if client.size >= 1
        self.errors.add(:base, "Client exists as #{client.first.name}")
        false
      end
    end
end

NB:

  • Rails v2.3.5

4 个答案:

答案 0 :(得分:2)

如果您想采用自定义验证器路径:

class Client < ActiveRecord::Base
  validate :client_uniqueness

protected

  def client_uniqueness
    duplicates = self.class.all(:conditions => {
      :first_name => first_name,
      :middle_name => middle_name,
      :last_name => last_name,
      :date_of_birth => date_of_birth
    })

    if duplicates.present?
      errors.add_to_base "Client exists as #{duplicates.map(&:name).to_sentence}"
    end
  end
end

答案 1 :(得分:1)

没有理由在验证中无法做到这一点。通过validate类方法(Doc)。

如果您想要更清洁的型号,或者在多个型号中使用它,可以使用自定义验证器轻微干燥。

你可以有这样的东西

class Client < ActiveRecord::Base
  validates_uniq_with_custom_message :first_name, :middle_name, :dob #etc
end

这是关于主题的好blog

答案 2 :(得分:1)

您不应将验证代码放在before_validation回调中。将before_validation_on_create :prevent_duplicate_clients更改为validate :prevent_duplicate_clients

答案 3 :(得分:0)

我认为你走在正确的轨道上 - 我的问题是你是应该添加错误还是只是将细节添加到现有客户端。