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:
まったく別のアプローチを取るつもりです。このフォームで直接パスワードのリセットを許可する代わりに、パスワードをリセットするためのリンクを提供します。これにより、パスワードをリセットするためのリンクが記載された電子メールがユーザーに送信されます。
has_secure_password
そして、Clearance gemはそれぞれパスワードとパスワード確認を検証しますが、私はまだClearanceの検証を(頭上で)オーバーライドするのに十分なスキルを持っていません。だから私は別のアプローチを取りました。パスワードとパスワードの確認は、この編集フォームには含まれません。
このフォームで直接パスワードのリセットを許可する代わりに、パスワードをリセットするためのリンクを提供します。これにより、パスワードをリセットするためのリンクが記載された電子メールがユーザーに送信されます。ここでの追加の利点は、ユーザーが別のユーザーとしてログインできた場合、他のユーザーの電子メールアカウントにもハッキングしない限り、そのユーザーのパスワードをリセットできないことだと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加