0

私はレールと工夫が初めてなので、何が起こっているのか理解しようとしています。私は、ユーザーが自分のパスワードを編集できるようにするための devise wiki をフォローしています

私が混乱しているのは、モデルで :validatable を使用しているにもかかわらず、current_password を完了する限り、password/password_confirmation を空白のままにしてもフォームを送信できるように見えることです。これは、validatable.rbで !password.nil? の場合にのみパスワードの検証があるという事実と関係があるようです。1 行あたり 54

そこで、フォームの送信時に debug(params) を確認することにしましたが、password/password_confirmation フィールドを空白のままにすると、password/password_confirmation が params ハッシュにまったく表示されないようです (ただし、password.nil? は真実?)。

私が理解していないのは、なぜこれが起こるのですか?パスワード フィールドを空白のままにしても、"password" => "" のように、パスワードは他のフィールドと同じように params に表示されるべきではありませんか? フォームを処理するために独自のコントローラーアクションを使用しているので、パスワードがパラメーターにないのはどうしてですか?

4

1 に答える 1

1

そのupdate_with_passwordwiki ページで使用されている方法が、混乱の原因です。こちらに示すように、パラメーターが空白の場合は、パラメーターからと の両方passwordを削除しますpassword_confirmation

これは、独自のパスワード変更アクションを実装する方法を説明しているため、wiki ページの見落としのようです。その場合、これは間違いなく問題です (パスワードを入力せずに「パスワード変更」フォームを送信すると、おそらく失敗するはずです)。

とにかく、パスワードが空白かどうかを事前に確認するだけで、次のような方法で回避できます (必要にupdate_with_password応じてリファクタリングされます)。

def update_password
  @user = User.find(current_user.id)

  if params[:user][:password].blank?
    @user.errors.add(:password, :blank)
    render "edit"
  elsif @user.update_attributes(params[:user])
    # Sign in the user by passing validation in case his password changed
    sign_in @user, :bypass => true
    redirect_to root_path
  else
    render "edit"
  end
end
于 2012-08-20T02:16:38.247 に答える