LoginSignup
1
0

More than 3 years have passed since last update.

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

Posted at

はじめに

 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に置き換えて考えればいけるかと…

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0