ブラックボックスに感じていたdeviseのコントローラーを触ってみた


はじめに

 deviseとは、ユーザー管理機能の実装を簡単にしてくれるGem。簡単にしてくれているが故に、「なぜ、動作するのか」がわからない部分が多々存在していた。オリジナルのアプリケーションを作成していて、今までとは仕様を変更したいと思い、色々と試行錯誤し、以前よりもdeviseの使い方がわかってきた気がする。

deviseのコントローラー

 deviseについて初めて学習した時は、コントローラーについて、全く扱わなかった。他の機能ではMVCモデルを意識して、実装しているにも関わらず、deviseについては、ルーティングも勝手に生成されるし、コントローラーは存在すらしなかった。RailsがMVCモデルを謳っている以上、「コントローラーがあるのだろうが、見えなくなっているんだろうなぁ」程度の考えで今まで学習してきた。
 ターミナルでコマンドを確かめると、

rails g --help

=>
Devise:
  devise
  devise:controllers
  devise:install
  devise:views

deviseでコントローラーを生成できることに気づいた。

今まではdeviseのコントローラーを使わなかった場合

application_controller.rbにストロングパラメーターを設定していた。このファイルは全てのコントローラーに継承されているので、deviseのコントローラーにも適用れている。
devise以外のコントローラーに干渉しないように、

application_controller.rb
before_action :configure_permitted_parameters, if: :devise_controller?

 private
 def configure_permitted_parameters
   devise_parameter_sanitizer.permit(:sign_up, keys: [:カラム名])
 end

と記述し、devise_controller?でdeviseのコントローラーを使う時のみに、ストロングパラメーターの処理が行われるようにしたいた。

経緯

 現在作成しているアプリケーションでは、ユーザーのサインインを「メールアドレス」と「パスワード」での認証ではなく、「ニックネーム」と「パスワード」に変更できないか考えていた。

流れ

  1. deviseのコントローラーを生成
  2. サインインを任意の認証に変更
  3. deviseのコントローラーでストロングパラメーターを作成
  4. ルーティングにアクションを追記
  5. ビューファイルを任意の認証に変更

1. deviseのコントローラーを生成

ターミナルで

rails g devise:controllers user

他のコントローラーの生成と違うのは、controllersと複数形になる点。なぜなら、このコマンドで、deviseのサインイン・サインアップなど様々なコントローラーが同時に生成されるため。

2. サインインを任意の認証に変更

config/initializwes/devise.rb/49行目
config.authentication_keys = [:nickname]

コメントアウトを外し、任意の認証に使いたいカラムを記述。
:passwordは記述しなくても、サインインの認証に使うことができる。

3. deviseのコントローラーでストロングパラメーターを作成

app/controllers/user/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
  before_action :configure_sign_in_params, only: [:create] #コメントアウトを外す
(中略)
protected #コメントアウトを外す
# If you have extra params to permit, append them to the sanitizer.
def configure_sign_in_params #コメントアウトを外す
    devise_parameter_sanitizer.permit(:sign_in, keys: [:nickname, :password]) #コメントアウトを外し、角括弧の中に、認証に使いたいカラムを記述 ※ここはpasswordについても記述する
end #コメントアウトを外す

4. ルーティングにアクションを追記

config/routes.rb
devise_for :users, controllers: {sessions: 'users/sessions'}

users以降を追記。

5. ビューファイルを任意の認証に変更

views/devise/sessions/new.html.erb
<%= form_with model: @user, url: user_session_path, class: 'sessions-main', local: true do |f| %>
  <%= f.text_field :nickname, class:"nickname", id:"nickname", placeholder:"ニックネーム" %>
  <%= f.password_field :password, class:"input-default", id:"password", placeholder:"6文字以上の半角英数字" %>
  <%= f.submit "ログインする", class:"reg-btn" %>
<% end %>

最低限だと、こんな感じかと…

最後に

 同様に新規登録のコントローラーについても修正することが可能。sessionsの部分がregistrationsに置き換えて考えればいけるかと…