【问题标题】:Rails how can I get all custom validate methods that defined in a modelRails 如何获取模型中定义的所有自定义验证方法
【发布时间】:2014-11-18 13:24:46
【问题描述】:

我有一个名为 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) => []

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

【问题讨论】:

  • 尝试为 card_number 验证器方法使用与 card_number 不同的名称,因为 card_number 用于访问 Person 模型的 card_number 字段。
  • 为什么要使用自定义验证器进行存在检查,还是仅用于示例?
  • 您的 card_number 方法似乎在调用自己。 card_number 是模型数据库表中的字段吗?如果是这样,那么此方法将覆盖它的“getter”,我认为您不想这样做。如果您想使用自定义验证,请为其命名。
  • @Anand 是的,实际上自定义方法名称是 check_card_number,我用这个更新了 Qn。
  • @MohammadAbuShady 是的,因为我正在 check_card_number 自定义方法中检查与卡号相关的其他内容(例如:card_number 已经存在,然后添加一些自定义错误,将 card_number 与其他参数值进行比较等),并且还有其他代码。

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


【解决方案1】:

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

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

但是,方法“card_number.blank?”中的条件是从 card_number 属性的存在来看的。我猜这很适合:

validate_presence_of :name, :card_number

【讨论】:

  • 我不能使用 validate_presence_of,因为我正在检查 check_card_number 中与卡号相关的其他内容(例如:card_number 已经存在,然后添加一些自定义错误,将 card_number 与其他参数值进行比较等)自定义方法,以及其他代码。您能否更新您的答案,因为我将方法名称更改为 check_card_number
  • @Abhi :然后也使用唯一性验证器。想法是仅在您进行非常具体的自定义检查时使用自定义验证器,例如卡号有效,而不是一些随机数 1111-1111-1111-1111 等。
  • 是的,我只是这个意思,在里面做更多的事情
【解决方案2】:

试试这个:-

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

这里的'reject'用于忽略一些默认验证。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 是的,如果我们使用validates_with MyValidator,那么验证器方法会返回MyValidator。但我想检查存在检查是否调用了特定属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    相关资源
    最近更新 更多