2011-08-29 5 views
4

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

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

私はこのスレッドRails model validation on create and update onlyを読んだことがありますが、私の特定の問題には答えません。

UPDATE Userモデルスニペット:

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 

答えて

6

このvalidates_confirmation_ofによると、password_confirmationフィールドがnilの場合、モデルは有効である必要があります。 DDBBに保存していますか?または、何かがあなたの検証に間違っているかもしれません、ここにあなたのユーザーモデルを貼り付けることができますか?あなたはこのような何かを試すことができます

いずれかの方法:私はuser.rank属性を更新していますので、私はことを実行しています

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

おそらくそれは失敗している理由は、私は 'validates_presence_of:password_confirmation'ですか?ユーザーが空白のままにしておくとチェックしないので、追加しました。また、 ':password_changed?'は定義されていません。それを定義する必要はありますか? –

+0

パスワードは仮想フィールドなので、メソッドpassword_changed?生成されません。私はこれを修正するために私の答えを編集した、それは動作するはずです。 – cicloon

+0

ありがとう。これはまさに私が欠けていたものです。 –

6

正確にあなたが@comment.user.save!を実行しないのはなぜ?タッチング(例えば、タイムスタンプの更新)およびコメント数の増加は、組み込みの機構を介して行うことができる。


編集:あなたのコントローラとモデルがきれいになり、rank_userが呼び出されます

  1. :このアプローチの

    class Comment < ActiveRecord::Base 
        after_save :rank_user 
    
        def rank_user 
        # calculate rank 
        user.update_attribute(:rank, rank) 
        end 
    end 
    

    利点: 私は次のように何かをお勧めしたいです自動的に@comment.user.save!の明示的な呼び出しなしに。

  2. update_attribute documentationによれば、検証はスキップされ、パスワード確認エラーは発生しません。
+0

。コメントコントローラーの外でそのようなことをすることはできますか? –

+0

解決策を追加しました。うまくいけば、これはあなたのために動作します! –

関連する問題