4

validates_confirmation_of :passwordユーザーモデルにがあります。問題は@comment.user.save!、ユーザーアカウントの一部の属性を更新するためにコメントが作成されたときにも実行されることです。

コメントを作成するときにエラーが発生しますValidation failed: Password confirmation can't be blank。コントローラが保存関数も呼び出している:on => "save"ため、検証に追加できません。comments

このスレッドのRailsモデルの検証は作成と更新についてのみ読んだことがありますが、特定の問題には答えられません。

UPDATE ユーザーモデルスニペット:

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
4

2 に答える 2

6

これによると、password_confirmationフィールドがnilの場合、モデルのvalidates_confirmation_は有効である必要があります。DDBBに保存していますか?または、検証に問題がある可能性があります。ユーザーモデルをここに貼り付けてください。

どちらの方法でも、次のようなことを試すことができます。

validates_presence_of :password_confirmation, if: -> { password.present? }
validates_confirmation_of :password, if: -> { password.present? }
于 2011-08-29T11:56:34.893 に答える
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ドキュメントによると、検証はスキップされ、パスワード確認エラーは発生しません。
于 2011-08-29T11:17:27.920 に答える