8

パスワードが変更された場合のみパスワードが有効になるようにプログラムを設定しようとしています。そのため、ユーザーはパスワードを入力せずに他の情報を編集できます。 。未定義のメソッドpassword_changed?エラー

私がログインしようとしたとき、私は現在、

NoMethodError in UsersController#create, undefined method `password_changed?' for #<User:0x00000100d1d7a0> 

をというエラーを取得しています

ここでは私の検証コードはuser.rbである:ここでは

validates :name, :presence => true, 
:length => { :maximum => 50 } 
validates :email, :presence => true, 
:format  => { :with => email_regex }, 
:uniqueness => { :case_sensitive => false } 
validates :password, :presence =>true, :confirmation => true, :length => { :within => 6..40 }, :if=>:password_changed? 

は私の作成方法であり、 users_controller.rb

def create 
    @user = User.new(params[:user]) 
    if @user.save 
     sign_in @user 
     flash[:success] = "Welcome to the Sample App!" 
     redirect_to @user 
    else 
     @title = "Sign up" 
     render 'new' 
    end 
end 

ありがとうございました!

答えて

5

と交換してください:私はこれと同じ問題が発生したため、この記事を読んだ後、私は中apneadivingによって提案されたコードを実装

validates :password, :presence =>true, :confirmation => true, :length => { :within => 6..40 }, :on => :create 
validates :password, :confirmation => true, :length => { :within => 6..40 }, :on => :update, :unless => lambda{ |user| user.password.blank? } 
+0

いいえ、まだ同じエラーが発生します。 – steffi2392

+1

はあなたのモデルの 'password'カラムですか?データベース内の – apneadiving

+0

?いいえ、encrypted_pa​​sswordだけです。私はそれを追加する必要がありますか? – steffi2392

3

:私は2つの異なる検証を行うだろう

:if => lambda {|user| user.password_changed? } 

彼の答えは少し変更されました:

私は2つの異なるバリデーション、1つのfまたは作成します:

validates :password, :presence => true, :confirmation => true, :length => { :within => 6..128 }, :on => :create 

、その後、私は更新のために、このいずれかを使用:

validates :password, :presence => true, :confirmation => true, :length => { :within => 6..128 }, :on => :update, :unless => lambda{ |user| user.password.to_s.empty? } 

はもともと、私はapneadivingが提案まさに実装されますが、私は、ユーザーへの更新時に、それは実際に検証していなかったことに気づきました文字列の存在。のように、ユーザーがパスワードを" "(空白文字列)に設定できるようになりました。これは、事実その" ".blank? == trueによるものであり、従って、あなたは、それは次のように検証するために設定した場合:

その後
:unless => lambda { |user| user.password.blank? } 

空白の完全な文字列があるために提出されたユーザーによって提出された場合、それは検証を実行しません文字列を空白として読み取ります。これにより、基本的に更新プログラムの存在を確認する効果が無効になります。私がpassword.to_s.empty?の代わりに単純にpassword.empty?を行ったのは、誰かがユーザーモデルでupdate_attributesを呼び出し、パスワード、フィールドに何も渡されなかった場合、パスワードがnilになり、ruby nilクラスが空を持っている?メソッドを呼び出すと、エラーがスローされます。ただし、nil.to_sを呼び出すと、空の文字列に変換されます。これは、連続した.empty?呼び出しでtrueを返します(したがって、検証は実行されません)。だからいくつかの試練と試練の後、私はこれがこれを行う最善の方法であることが分かった。

1

少なくともRails 4では、変更はpassword_digestです。このエラーメッセージをグーグルで、そして私の場合は

@account.encrypted_password_changed?

を使用して、ここで終わった

@account.password = "my new password" 
@account.changes # => {"password_digest"=>["$2a$10$nR./uTAmcO0CmUSd5xOP2OMf8n7/vXuMD6EAgvCIsnoJDMpOzYzsa", "$2a$10$pVM18wPMzkyH5zQBvcf6ruJry22Yn8w7BrJ4U78o08eU/GMIqQUBW"]} 
@account.password_digest_changed? # => true 
+0

これは私のためにそれを固定しました、ありがとう! – IGNIS

+0

同様に、上記のどれも私のために働かなかった。 'validates_presence_of:password_confirmation、if:lambda {| staff | password_confirmation}は、次のようにして終了しました。 staff.password.present? } ' これで、パスワード属性が送信された場合にのみ、作成と更新の両方でpassword_confirmationが必要になりました。私はこれがデフォルト動作ではないことに驚いています。 –

1

私が欲しかったものが得られました。

関連する問題