この記事の内容
deviseをgemで導入し、デフォルトではemailとパスワードでログインしますが、名前とパスワードでログインする機能に変更してみました。ですが、ログインする事ができず、沼りましたので、備忘録として記事を上げました。解決策①は理屈がさっぱりわかりません‥。解決策②は、自分でも納得できたものになります。
付記
とにかく初心者です。記事の投稿も初めてです。Markdownもままなりません。優しくして下さい。
前提
deviseをgemでインストール済
解決前
他記事を参考に以下のように編集しました。(シンプルにnameでいいのですが、なぜか私はnicknameに統一しています‥。)
config.authentication_keys = [:nickname] #49行目
<div class="field">
<%= f.label :nickname %><br />
<%= f.text_field :nickname, autofocus: true, autocomplete: "nickname" %>
</div>
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:email])
end
end
原因の把握
このような形で実装した所、ログインができず…。ターミナルを確認した所、以下のようなエラーが…!(実際は赤色です)
Unpermitted parameter: :nickname
ログイン時にnicknameが上手く送信できていないのが原因みたいです‥。
解決策①
コード見直していた所、devise.rbに他にもemailの記載があったため、nicknameに変更してみました。
config.case_insensitive_keys = [:email] #変更前 61行目
config.case_insensitive_keys = [:nickname] #変更後 61行目
config.strip_whitespace_keys = [:email] #変更前 66行目
config.strip_whitespace_keys = [:nickname] #変更後 66行目
この変更で、名前とパスワードだけで、ログインできるようになりました。理屈はわかりません‥。また、他記事に記載してあったのですが、61行目と66行目をコメントアウトしてもできるそうです。
解決策②
解決策①は一旦、忘れて下さい。こちらの方が正攻法?のような気がします。
nicknameがUnpermitted parameterというエラーが気になり、以下を試したところ、問題なくいけました。
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:email])
devise_parameter_sanitizer.permit(:sign_in, keys: [:nickname]) #←これを追記
end
end
sign_up(新規登録時)と、sign_in(ログイン時)のキーになる名前を使い分ければいけなかったのかなと、理解することにしました。
解決策①でおこなった61行目と66行目のコードは変更前に戻しました。
最後に
今思えば、ストロングパラメーターのpermitの引数(特にsign_upとかsign_in)について理解していれば、解決できる内容でした。実は、この名前とパスワードでログインできないこの事象に、2日間悩まされました。
同じような事で、悩まれた方の手助けになっていれば幸いです。
そして、もっと良いコードの書き方などありましたら、ご教授いただけますと幸いです。