パスワードを更新していないのに、ユーザーの更新中に「パスワードを空白にすることはできません」というメッセージが表示されるのはなぜですか(Rails4の「has_secure_password」)。

digijim

Rails 4.0.9アプリで、認証にBCrypt3.1.7とClearance1.4.2を使用すると、ユーザーの情報を更新するときにエラーが返されます。新しいパスワードまたはパスワード確認を入力しないのに、「パスワードを空白にすることはできません」というエラーが表示されます。

私はSOとグーグルで高低を見てきましたが、私が見つけた解決策はどれも私にはうまくいきません。ほとんどは以前のバージョンのRails用であり、現在は古くなっている可能性があり、その他は私の正確な状況に実際には適合しません(おそらく、私が骨の折れることをしているだけだからです)。

編集フォームからpasswordフィールドとpassword_confirmationフィールドを削除することもできますが、ユーザーが気になる場合は、名前やメールアドレスを更新しながらパスワードを更新できるようたいと思います。

'has_secure_password'は作成時にのみ検証することになっていますが、更新時にも検証しているようです。問題のトラブルシューティングを行うために、パスワードとpassword_confirmationに対するユーザーモデルの検証を無効にし、これらのパラメーターの検証のために「has_secure_password」を配置しました。検証エラーが発生する理由がわかりますか?Clearance gemはhas_secure_passwordsのデフォルトの動作をオーバーライドしますか、それとも何らかの方法で検証に影響を与えますか?

ユーザーモデル

class User < ActiveRecord::Base
include Clearance::User
belongs_to :studio
has_one :public_user

before_save { self.email = email.downcase }
before_create :create_remember_token
after_create :make_public_user

validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i
validates :email, presence: true,
                format:     { with: VALID_EMAIL_REGEX },
                uniqueness: { case_sensitive: false }
has_secure_password
#   validates :password, length: { minimum: 6, on: :create }
#   validates :password_confirmation, presence: { on: :create }
...

ユーザーコントローラー

...
def edit
end

def update
  if @user.update_attributes(user_params)
    flash[:success] = "Profile updated"
    redirect_to @user
  else
    render 'edit'
  end
end

private


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

フォームの編集(実際には「_fields.html.erb」の一部)

<%= render 'shared/error_messages', object: f.object %>

<div class="control-group">
        <%= f.label :name, class: "control-label" %>
<div class="controls">
        <%= f.text_field :name %>
    </div>
</div>

<div class="control-group">
    <%= f.label :email, class: "control-label" %>
<div class="controls">
        <%= f.text_field :email %>
    </div>
</div>

<div class="control-group">
    <%= f.label :password, class: "control-label" %>
<div class="controls">
        <%= f.password_field :password, placeholder: 'Enter new password if changing' %>
    </div>
</div>

<div class="control-group">
    <%= f.label :password_confirmation, "Confirmation", class: "control-label" %>
    <div class="controls">
        <%= f.password_field :password_confirmation, placeholder: 'Confirm your new password if changing' %>
    </div>
</div>

コントローラに渡されるパラメータ

Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "user"=>{"name"=>"Ransom Kshlerin III", "email"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Save changes", "id"=>"4"}

編集:

'has_secure_password'を無効にしても、検証エラーが発生します。これにより、Clearanceの検証でエラーが返されていると思われます。Clearanceのパスワード検証をオーバーライドする必要があると思いますが、それはユーザーを更新するときだけです。どうすればいいですか?

編集2:

まったく別のアプローチを取るつもりです。このフォームで直接パスワードのリセットを許可する代わりに、パスワードをリセットするためのリンクを提供します。これにより、パスワードをリセットするためのリンクが記載された電子メールがユーザーに送信されます。

digijim

has_secure_passwordそして、Clearance gemはそれぞれパスワードとパスワード確認を検証しますが、私はまだClearanceの検証を(頭上で)オーバーライドするのに十分なスキルを持っていません。だから私は別のアプローチを取りました。パスワードとパスワードの確認は、この編集フォームには含まれません。

このフォームで直接パスワードのリセットを許可する代わりに、パスワードをリセットするためのリンクを提供します。これにより、パスワードをリセットするためのリンクが記載された電子メールがユーザーに送信されます。ここでの追加の利点は、ユーザーが別のユーザーとしてログインできた場合、他のユーザーの電子メールアカウントにもハッキングしない限り、そのユーザーのパスワードをリセットできないことだと思います。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ