8

パスワードが変更された場合にのみパスワードが検証されるようにプログラムを設定しようとしています (そのため、ユーザーはパスワードを入力しなくても他の情報を編集できます)。

現在、次のエラーが表示されます

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

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

4

4 に答える 4

5

と置換する:

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

私は2つの異なる検証を行います:

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? }  
于 2011-08-16T15:40:47.667 に答える
3

私はこの同じ問題に遭遇し、この投稿を読んだ後、彼の回答でapneadivingによって提案されたコードを実装しましたが、わずかな変更を加えました:

2 つの異なる検証を使用しました。1 つは作成用です。

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?私が代わりに行った理由は、誰かがユーザー モデルでupdate_attributespassword.empty?を呼び出し、パスワード フィールドに何も渡さない場合のエラーを防ぐためです。その場合、パスワードは になります。メソッドでは、エラーがスローされます。ただし、 onを呼び出すと、空の文字列に変換され、後続の呼び出しで true が返されます (したがって、検証は実行されません)。それで、いくつかの試練と苦難の末、これが最善の方法であることがわかりました。nilnil.to_snil.empty?

于 2011-10-14T18:19:55.377 に答える
2

ここでこのエラーメッセージをグーグルで検索し、

@account.encrypted_password_changed?

私の場合、私が望んでいたものが得られました。

于 2015-11-04T04:24:53.760 に答える
1

少なくとも Rails 4 で注目すべき変更点はpassword_digest.

@account.password = "my new password"
@account.changes # => {"password_digest"=>["$2a$10$nR./uTAmcO0CmUSd5xOP2OMf8n7/vXuMD6EAgvCIsnoJDMpOzYzsa", "$2a$10$pVM18wPMzkyH5zQBvcf6ruJry22Yn8w7BrJ4U78o08eU/GMIqQUBW"]}
@account.password_digest_changed? # => true
于 2015-07-17T23:48:30.027 に答える