Rails如何获得模型中定义的所有自定义验证方法

时间:2014-11-18 13:24:47

标签: ruby-on-rails ruby ruby-on-rails-3.2 rails-activerecord

我有一个名为Person的模型。

class Person < ActiveRecord::Base
  validate_presence_of :name
  validate :check_card_number

  def check_card_number
    errors.add(:card_number, "Card Number can't be blank") if card_number.blank?
      -----
      # some other stuffs here
      ----
  end 
end

如果我调用以下方法,我将获得验证器类名称

Person.validators_on(:name) => [ActiveModel::Validations::PresenceValidator]

但是

Person.validators_on(:card_number) => []

如何检查我是否正在验证卡号的存在?

3 个答案:

答案 0 :(得分:1)

validate方法实际上将一个方法(作为参数传递)插入callback chain。因为,它不会使用ActiveModel中的任何defined validators。因此,它可以这样访问:

Person.send(:get_callbacks, :validate).detect{ |cb| cb.filter == :check_card_number }

然而,方法中的条件&#34; card_number.blank?&#34;从card_number属性的存在看起来。在我的猜测中哪个适合:

validate_presence_of :name, :card_number

答案 1 :(得分:0)

试试这个: -

ModelName._validate_callbacks.to_a.reject { |validation| validation.filter.to_s.starts_with?('validate_associated_records') }

这里&#39;拒绝&#39;用于忽略某些默认验证。

答案 2 :(得分:-1)

我怀疑这是可能的。刚试过Person.validators但它没有返回自定义验证方法

如果您真的希望validators_onvalidators返回所有验证器,您可以create a custom ActiveModel::Validator分类并使用validates_with在模型中注册。