目標
deviseのユーザー登録/ログイン方法は、デフォルトでメールアドレスとパスワード。
これをユーザ名で登録/ログインできるように変更する。
準備
-
deviseをインストール
Gemfileにgem 'devise'
追記 +$ bundle install
-
初期設定
rails g devise:install
-
モデル作成 *モデル名は任意(今回はUser)
rails g devise User
-
View作成
rails g devise:views users
views/usersのカスタマイズを反映するため、デフォルトのスコープを変更。
具体的には、config.scoped_viewsをtrueに変更。
config/initializers/devise.rb
config.scoped_views = true
実装
ユーザ登録(Sign Up)
- ユーザ名カラムを追加 +
rails db:migrate
マイグレーションファイル
def change
create_table :users do |t|
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
t.string :name, null: false # null: false(=空の状態で保存させるのを防ぐ)
# 中略
t.timestamps null: false
end
【注意】
nameをログイン時のキーに使用する場合(記事の最後で認証キーをnameに設定します)、ユーザーと一意に紐づけられている必要があります。
今回はバリデーションで、nameにuniqueness:trueを設定しています。
- ユーザ登録画面にユーザ名入力フォームを追加(views/devise/registrations/new.html.erb)
- ストロングパラメータを設定し、ユーザ名とemailのデータ操作を許可
*ここでemailも許可する理由は、後から認証キーをemailからnameに変更するため。
application_controller.rb
before_action :configure_permitted_parameters, if: :devise_controller?
# deviseの機能が使われる前に、configure_permitted_parametersを実行
protected
def configure_permitted_parameter
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :email]) # sign_up時にユーザ名(+email)の操作を許可
end
ログイン(Sign In)
- ログイン画面にフォームを追加(views/devise/sessions/new.html.erb)
- 認証キーをemail→nameに変更 *コメントアウトは外す
config/initializers/devise.rb
config.authentication_keys = [:name]