0
1

More than 3 years have passed since last update.

deviseについて

Posted at

WHY

deviseの導入やデフォルトの設定など度々わすれてしまうので1つのアウトプットとしてこれに書き出す。


deviseとは

ユーザーの管理機能やログイン機能などが簡単に実装できるGem。

deviseの導入

Gemfileの最後に記述

gem 'devise'

ターミナルで以下を記述していく
※pwcはカレントディレクトリが導入したいディレクトリであることを確認するため

pwd

bundle install

rails g devise:install

最後に「* Not required *」と表記されれば成功。

モデルを作成

ターミナルで以下を実行

rails g devise user

db/migrateディレクトリに20XXXXXXXXX_devise_create_users.rbのようなマイグレーションファイルが生成される。
続いてルーティングに


Rails.application.routes.draw do
  devise_for :users
end

のような記述がある。
これでユーザー機能に必要なルーティングを一度に生成してくれている。

テーブルを作成

マイグレーションファイルをみてみるとすでにemailpasswordは記述されている。

create_table :users do |t|
     ## Database authenticatable
     t.string :email,              null: false, default: ""
     t.string :encrypted_password, null: false, default: ""
 #以下略

これに続けて追加したいカラムを記述していき、マイグレートする。

rails db:migrate

ビューファイルも自動生成されるがデフォルトでは編集することができないため、
ターミナルで以下のようなコードを実行し、
deviseに用意されたビューファイルをコピーし、app/viewsの配下に配置する

rails g devise:views

その他deviseのデフォルト設定など

encrypted_password

deviseではデフォルトで普通のpasswordではなく、encrypted_passwordが用意されている。
deviseを使用する場合、新規登録の際にpasswordというキーに対して入力された値は暗号化されてencrypted_passwordというカラムに保存される。
そのため、パスワード入力フィールドには:password:password_confirmationを使用するが、
deviseを使用する場合はテーブルにpasswordカラムやpassword_confirmationカラムがなくても問題ない

<%= f.label :password, "パスワード(6文字以上)" %><br />
 <%= f.password_field :password, autocomplete: "new-password" %>

 <%= f.label :password_confirmation, "パスワード再入力" %><br />
 <%= f.password_field :password_confirmation, autocomplete: "new-password" %>

#[:password][:password_confirmation]で情報は受け取るが、
#encrypted_passwordカラムで保存される

devise_parameter_sanitizerメソッド

deviseを導入することによって使えるメソッド。
デフォルトのままだとemail , passwordはパラメーターから取得できるが、カラムを追加した場合はその追加したカラムの情報が受け取れない。
devise_parameter_sanitizerメソッドで受け取りたいパラメーターを指定することができる。
※emailとpasswordは指定しなくていい。

private
def configure_permitted_parameters  # メソッド名は慣習
  # deviseのUserモデルにパラメーターを許可
  devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
end

deviseの処理名

処理名 役割
:sign_in サインイン(ログイン)の処理を行うとき
:sign_up サインアップ(新規登録)の処理を行うとき
:account_update アカウント情報更新の処理を行うとき

また、定義したconfigure_permitted_parametersメソッドはdeviseに関するコントローラーの処理のときだけ使用したいのでbefore_actionを使い、このように記述する。

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

デフォルトのバリデーション

deviseにはもとからバリデーションが設けられているものがある。
(例)
・メールアドレスには@が含まれていないと保存できない
・メールアドレスが重複していると保存できない
・パスワードは「6〜128文字」
文字数などのバリデーションはconfig/initializers/devise.rbで確認、変更できる。


また、自分でバリデーションを設定したいとき、デフォルトのバリデーションが邪魔をする時は、

class User < ApplicationRecord
 devise :database_authenticatable, :registerable,
  :recoverable, :rememberable, :validatable 
                                  #↑削除する。
end

モデルファイルの上記の記述を削除すればバリデーションが無効になる。


configure_permitted_parametersとかdevise_parameter_sanitizerは長すぎて今だに覚えれてないので、自分の記事からコピペします、、、

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