ruby-on-rails 正在检查ActiveModel::EachValidator中的属性是否已更改

rdlzhqv9  于 2023-01-10  发布在  Ruby
关注(0)|答案(1)|浏览(85)

我有一个类Person,它有first_name,middle_name,last_name。我有一个自定义的Each验证器,用于这3个属性,如下所示

validates :first_name, :middle_name, :last_name, nameValidator: true

在这个验证器中,我想检查这3个属性中是否有任何一个发生了变化,并给出一些条件来验证name。为此,我尝试使用attribute_changed?,但它不起作用。
我检查了ActiveModel::Dirty和Activerecod::Dirty的不同方法,但似乎没有任何方法可以检查每个属性的更改。

module Person
  class nameValidator < ActiveModel::EachValidator

    def validate_each(record, attribute, value)
      return unless can_normalize?(record)
      #Normalization code 
    end

   def can_normalize?(record)
      anything_new = record.new_record? || attribute_changed?
   end
  end
end
eyh26e7m

eyh26e7m1#

如果需要检查某个属性是否发生了更改,则需要对记录调用attribute_changed?方法,并按如下方式传递此属性

return unless record.new_record? || record.attribute_changed?(attribute)

或者可以使用像这样的元编程方法

return unless record.new_record? || record.public_send("#{attribute}_changed?")

一些注意事项:
在Ruby中,我们通常使用PascalCase作为类名,使用snake_case作为散列键
验证用于数据验证,而不是某种规范化。它通常用于添加验证错误

相关问题