#はじめに
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以外のコントローラーに干渉しないように、
before_action :configure_permitted_parameters, if: :devise_controller?
private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:カラム名])
end
と記述し、devise_controller?でdeviseのコントローラーを使う時のみに、ストロングパラメーターの処理が行われるようにしたいた。
##経緯
現在作成しているアプリケーションでは、ユーザーのサインインを「メールアドレス」と「パスワード」での認証ではなく、「ニックネーム」と「パスワード」に変更できないか考えていた。
##流れ
- deviseのコントローラーを生成
- サインインを任意の認証に変更
- deviseのコントローラーでストロングパラメーターを作成
- ルーティングにアクションを追記
- ビューファイルを任意の認証に変更
###1. deviseのコントローラーを生成
ターミナルで
rails g devise:controllers user
他のコントローラーの生成と違うのは、controllersと複数形になる点。なぜなら、このコマンドで、deviseのサインイン・サインアップなど様々なコントローラーが同時に生成されるため。
###2. サインインを任意の認証に変更
config.authentication_keys = [:nickname]
コメントアウトを外し、任意の認証に使いたいカラムを記述。
※:password
は記述しなくても、サインインの認証に使うことができる。
###3. deviseのコントローラーでストロングパラメーターを作成
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. ルーティングにアクションを追記
devise_for :users, controllers: {sessions: 'users/sessions'}
users
以降を追記。
###5. ビューファイルを任意の認証に変更
<%= 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に置き換えて考えればいけるかと…