我的用户模型中有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
答案 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
这种方法的好处:
rank_user
会自动调用,而不会显式调用@comment.user.save!
。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? }