Rails:在验证编辑期间比较旧值和新值

Mat*_*Hui 6 ruby-on-rails

我想创建一个自定义验证函数,只有当数据库中的当前字段不为空时才允许将字段保存为空/零.如何在验证功能中访问数据库值(旧值)?我可以使用self.name_of_field访问新值.

这就是我现在所拥有的

validate :image_remote_url_change
  def image_remote_url_change
    if self.image_remote_url.blank? and self.image_remote_url_changed?
      errors.add(:field, "can't be blank once set")
      return false
    end
  end
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试编辑现有对象,它将不接受新的空值,但是在创建新对象时,即使从未设置旧值,也会说"设置后不能为空".

小智 7

您可以利用ActiveModel :: Dirty.在自定义验证功能中,您可以检查字段是否为空以及是否已更改:

validate :custom_validation_function

def custom_validation_function
  if self.field.blank? and self.field_changed?
      errors.add(:field, "can't be blank once set")
      return false
  end
end
Run Code Online (Sandbox Code Playgroud)

  • +1.来自Heroku的Schneems有一篇[简短的文章](http://schneems.com/post/28425724540/get-previously-saved-changes-in-rails)讨论了previous_changes方法,它也可能对你有所帮助 (2认同)
  • 如今,您无需检查`!new_record?`,而是可以使用`:on`选项告诉验证仅在更新时运行(而不在创建时),例如`validate:custom_validation_function,on::update`-请参阅http://guides.rubyonrails.org/active_record_validations.html#on (2认同)