LoginSignup
5
1

More than 3 years have passed since last update.

[Rails]deviseを使ってユーザ管理をしよう

Last updated at Posted at 2021-03-30

はじめに

ご意見、ご要望があれば是非コメントください!
また、こうしてほしい!やこれ教えて!といったリクエストについてもお待ちしております!

deviseとは

deviseとは、ユーザ管理機能(例:ログイン、ログアウト、新規登録)を簡単に実装できてしまうgemのことです。

前提条件

・基本的なrailsの仕組みを理解していること
・本記事では導入から簡単な仕組み説明をいたします

さっそく導入してみよう

まずは、gemをインストールします。

Gemfile
gem 'devise'

このとき、deviceとしないように注意してください、私はしました(笑)
では、以下のコマンドを打ってください。使用するアプリディレクトリでおこなってください

bundle install

このあと、一旦rails sでサーバを起動させましょう

deviseの設定ファイルを作成

以下のコマンドを打ってください。
これはdeviseに関する設定ファイルを自動生成してくれるコマンドになります。

rails g devise:install

これで一旦、事前準備は終了です。

Userモデルの作成をする

ここからモデルを作成していきましょう
今回は、ユーザ管理を行うためのモデルをUserとします。
通常であれば、

rails g model user

としますが、deviseの場合は以下のようにします

rails g devise user

rails g deviseコマンドという、モデルとマイグレーションの作成やルーティング設定をまとめてしてくれます。

config/routes.rb
Rails.application.routes.draw do
  devise_for :users #追加された部分
  root to: 'tweets#index'
  resources :tweets

end

devise_forはメソッドの1つで、ユーザ管理機能における複数のルーティングを一気に作ってくれます。
ただこの段階では、当然モデルを作成してませんので、rails sしてもエラーが出ます

さて、先ほど作成したモデルのマイグレーションファイルを見てみましょう

db/migrate/20XXXXXXXXX_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
 def change
   create_table :users do |t|
     ## Database authenticatable
     t.string :email,              null: false, default: ""
     t.string :encrypted_password, null: false, default: ""
   t.string :name, null:false #自分で追加したカラム


     ## Recoverable
     t.string   :reset_password_token
     t.datetime :reset_password_sent_at

     ## Rememberable
     t.datetime :remember_created_at

     # 省略

     t.timestamps null: false
   end

   add_index :users, :email,                unique: true
   add_index :users, :reset_password_token, unique: true
   # add_index :users, :confirmation_token,   unique: true
   # add_index :users, :unlock_token,         unique: true
 end
end

うまくできていれば、こんな感じになっているかと思います。
デフォルトで既にカラムが設定されていますので
新たに欲しいカラムがあれば、自分で追加しておきましょう。(今回は7行目にnameカラムを追加しています)

Viewを作成しよう

続いて、viewファイルを作ってみましょう。実はdeviseはもともと用意してくれてます。
以下のコマンドを打ってみてください。

rails g devise:views

このコマンドはapp/viewsにdeviseがもつデフォルトのviewファイルをコピーして配置してくれます。
例えば、
サインアップ画面→app/views/devise/registrations/new.html.erb
ログイン画面のビュー→app/views/devise/sessions/new.html.erb
というビューファイルが対応しています。

気になる方は実際に触ってみて確認してください。
変更を加えてみるのも面白いです!

ところで、コントローラ設定は、、、!?

お気づきの方もいるかと思いますが、
コントローラーの設定をしてないですよね!?

実は、deviseのコントローラーはGemに記載されているので編集ができません!!!!

じゃあどうするのか、application_controller.rbを使用しましょう!!

application_controller.rbからコントローラをいじる

上述したように、deviseのコントローラは直接編集できません。

そこでapplication_controller.rbを使用します。
application_controller.rbは言ってみればコントローラ界の王です。
すべてのコントローラがapplication_controller.rbを継承します。

例えば、ストロングパラメータの設定をしたい!!というときは以下のようにします。

application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
  end
end

一個づつ説明します。
まずはメソッドについて。

application_controller.rb

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end

devise_parameter_sanitizerはdeviseにおけるparamsのようなメソッドです。
deviseのUserモデルに関する「ログイン」「新規登録」などのリクエストからパラメーターを取得できます。

記載の仕方は、

devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])

:deviseの処理名の一例は以下です。

処理名 役割
:sign_in ログイン処理
:account_update ユーザ情報更新

許可するキーは今回、デフォルト以外で設定したnameキーを指定しています。

deviseを使っているのでこういったメソッドを使用しますが、使っていなければ
params.require(:user).permit(:~,:~)とできますね。

続いて、before_actionについてですが、これを設定しておけば、各コントローラよりも先に指定のアクションを行ってくれます。

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

ただし、毎回全てのコントローラの前に、このbefore_actionを実行する必要はないので
if: :devise_controller?で、deviseのコントローラに対してのみ行うようにします。
なお、:devise_controller?はdeviseのヘルパーメソッドです。

終わりに

以上、deviseの紹介についてでした。

deviseを導入すると今回紹介したこと以外にもcurrent_userが使えたりなど便利なものが多いので
是非調べて実践してみてください。

LGTMもお待ちしております!

5
1
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
5
1