はじめに
現在カフェHPをRailsを用いて開発中です。管理者画面へのログイン機能をDeviseを用いて実装していく中で、Devise
にデフォルトで設定されている挙動に苦しめられた為、Devise
のカスタマイズ方法を備忘録として残しておきます。
やりたいこと
ログイン画面ではヘッダーを表示させない。
現状
ログインフォーム未入力等でログイン失敗した際に、ログインページが再度読み込まれてヘッダーが表示される。
※ちなみにヘッダーはログイン画面で表示されないように以下の記述をしています。
<header>
<% unless current_page?(admin_session_path) %>
<%= render "layouts/header-img" %>
<%= render "layouts/nav" %>
<%= render "layouts/burger"%>
<% end %>
</header>
原因
どうやらDeviseはデフォルトのコントローラー設定により、ログイン認証に失敗すると、自動でsessionコントローラ内の別のアクションにリダイレクトする模様。
しかしターミナル上でログインボタンを押した際の挙動を確認してみるとCompleted 401 Unauthorized
のエラーが吐き出され、新規にログインページsessions#new
を読み込んでおり、これが原因っぽい。
解決方法
やり方として正しいかはわからないが、sessions_controller
のcreate
メソッドをカスタマイズして、リダイレクト先を指定することでヘッダーは表示されなくなった。
備忘録のため、以下にその際の手順を記載します。
【Devise】 createメソッドカスタマイズ方法
1. Deviseデフォルトの設定を受け継いだコントローラーを作成
まずはDeviseデフォルトのコントローラー設定を継承したカスタムコントローラーを作成していきます。
rails g devise:controllers admins
-
コントローラー名なので複数形にする
-
admins
の部分は作成したモデル名
一般ユーザーしかいないならusers
-
作成されたファイルを確認。
以下のファイルが作成されるので、カスタマイズしたいコントローラーを編集していきます。 今回はsessions#create
をカスタムしたいのでsessions_controller.rb
をイジっていきましょう。
create app/controllers/admins/confirmations_controller.rb
create app/controllers/admins/passwords_controller.rb
create app/controllers/admins/registrations_controller.rb
create app/controllers/admins/sessions_controller.rb
create app/controllers/admins/unlocks_controller.rb
create app/controllers/admins/omniauth_callbacks_controller.rb
2. routes.rb
の修正
続いてカスタムコントローラーを読み込む為にroutes.rb
を以下のようにします。
devise_for :admins, controllers: {
sessions: "admins/sessions"
}
3. createメソッドをカスタマイズ
ここからcreateメソッドをカスタマイズしていきますが、まずは分かりやすいようにDevise デフォルトの設定をコピペしてきます。
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message!(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
end
1行目に書かれている
self.resource = warden.authenticate!(auth_options)
により、ログイン認証に失敗すると、自動でsessionコントローラ内の別のアクションにリダイレクトするようになっています。
デフォルトではnewに設定されていますが、今回は改めてリダイレクト先を設定してやりましょう。
書き換えるにはauth_options
の設定値を書き換えてやる必要があります。
auth_options
自体はDeviseのデフォルトコントローラに定義されていて、直接はさわれないため、オーバーライドしてやります。
def failed
redirect_to new_admin_session_path
end
protected
def auth_options
{ scope: resource_name, recall: "#{controller_path}#failed" }
end
fail
アクションを用意して、認証失敗時にはそちらにリダイレクトするようにしています。
これでログイン失敗時にもヘッダーが表示されることはなくなりました!
さいごに
今回はDeviseをカスタマイズすることで、とりあえずは表示に問題なくなりました。
しかしDeviseについては、まだまだ理解不足なところが多いため、デフォルトの挙動についても少しずつ理解していきたいと思います。
間違いなどがありましたらコメント頂けると嬉しいです。