Rails仅在用户创建或更新时验证

时间:2011-08-29 11:13:43

标签: ruby-on-rails-3 validation password-confirmation

我的用户模型中有validates_confirmation_of :password。问题是,当创建注释以更新用户帐户的某些属性时,我也会运行@comment.user.save!

创建评论Validation failed: Password confirmation can't be blank时出错。我无法将:on => "save"添加到验证中,因为我的comments控制器也在调用保存功能。

我已阅读此帖子Rails model validation on create and update only,但它没有回答我的具体问题。

更新 用户模型代码段:

class User < ActiveRecord::Base

  attr_accessor :password

  # validations
  validates_presence_of :username
  validates_length_of :username, :within => 6..25
  validates_uniqueness_of :username
  validates_presence_of :email
  validates_length_of :email, :maximum => 100
  validates_format_of :email, :with => EMAIL_REGEX
  validates_confirmation_of :password, :if => :password_changed?
  validates_presence_of :password_confirmation
  validates_length_of :password, :within => 4..25, :on => :create

  before_save :create_hashed_password
  after_save :clear_password

  private

  def clear_password
    self.password = nil
  end

end

2 个答案:

答案 0 :(得分:6)

为什么要运行@comment.user.save!?触摸(例如更新时间戳)和增加注释计数可以通过内置机制完成。


修改 我建议类似于:

class Comment < ActiveRecord::Base
  after_save :rank_user

  def rank_user
    # calculate rank
    user.update_attribute(:rank, rank)
  end
end

这种方法的好处:

  1. 您的控制器和模型将会干净,rank_user会自动调用,而不会显式调用@comment.user.save!
  2. 根据update_attribute documentation,将跳过验证,从而导致无密码确认错误。

答案 1 :(得分:6)

根据此validates_confirmation_of,如果password_confirmation字段为nil,则模型应该有效。你把它存放到DDBB吗?或者您的验证可能有问题,您可以在此处粘贴用户模型吗?

无论哪种方式,你都可以尝试这样的事情:

validates_presence_of :password_confirmation, if: -> { password.present? }
validates_confirmation_of :password, if: -> { password.present? }