首页 > 解决方案 > 如何在 Rails 中验证字段,Active:Model::Validator

问题描述

我正在尝试编写一个验证器,它只会在销售状态为非活动状态时更新一本书的价格。

# frozen_string_literal: true

class BookPriceValidator < ActiveModel::Validator
  def validate(record)

    record.errors[:price] << "can't change price on book" if record.selling == "active"
  end
end

我现在遇到的问题是即使未更新图书价格也会调用错误。仅当 :price 字段实际更改时,我如何才能调用此错误?

标签: ruby-on-railsactiverecord

解决方案


您可以将条件更改为

if record.price_changed? && record.selling == "active"` 

ActiveModel::Dirty跟踪对ActiveRecord对象所做的未持久更改,并为每个属性添加便利方法[attribute_name]_changed?。因此,您所要做的就是检查价格是否随着您当前的状况而变化。


推荐阅读