0

ユーザーがプロファイルを編集するときに現在のパスワードを入力するようにします。

これは私のユーザーモデルがどのように見えるかです:

attr_accessor :current_password

def current_password
  errors[:current_password] << 'Incorrect password' unless self.current_password == self.password
end

validate :current_password, on: :update

そして私のコントローラパラメータ:

def user_params
  params.require(:user).permit(:email, :name, :current_password, :password, :password_confirmation, :phone)
end

そしてユーザーフォームのパーシャル:

<div class="form-group">
  <%= f.label :password, "Current password" %>
  <%= f.password_field :current_password, class: "form-control", placeholder: "Current password" %>
</div>

しかし、スタックレベルが深すぎて、検証ループに入ります。

私は何を間違っていますか?

4

3 に答える 3

2

この方法

def current_password
  errors[:current_password] << 'Incorrect password' unless self.current_password == self.password
end

自分自身を呼び出します: スタックが深すぎるというエラーが発生するのはそのためです。自分自身を無限に呼び出すループに陥っています。

current_passwordメソッドが によって作成されたものを上書きしattr_accessor :current_password、値を返すだけでなく、実際に何らかの検証を行っているため、あなたがしようとしていることは混乱を招きます。代わりにこれを行います:

attr_accessor :current_password

validate :current_password_same_as_password, on: :update

def current_password_same_as_password
  errors[:current_password] << 'Incorrect password' unless self.current_password == self.password
end

したがって、ここでは、attr_accessor メソッドをそのままにしておきます。これらは、インスタンス変数メソッドへの単純な読み書きです。検証には別のメソッド名があるため、アクセサー メソッド名と競合していません。

于 2015-05-12T15:12:17.233 に答える
1

他の回答が言ったように、current_password に無限ループがあります。検証ロジックを独自のメソッドに引き出します。次のようなもの。

validate :has_correct_current_password, on: :update

def has_correct_current_password
  errors[:current_password] << 'Incorrect password' unless current_password == password
end
于 2015-05-12T15:19:19.177 に答える
1

current_password は自分自身を呼び出しています。無限再帰があります。

あなたは基本的にこれをやっています:

def current_password
  self.current_password
end
于 2015-05-12T15:13:56.370 に答える