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
のような記述がある。
これでユーザー機能に必要なルーティングを一度に生成してくれている。
テーブルを作成
マイグレーションファイルをみてみるとすでにemailとpasswordは記述されている。
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は長すぎて今だに覚えれてないので、自分の記事からコピペします、、、