【Rails初心者】ユーザー/管理者を分けて認証機能を作る
アカウント管理を行える「devise」を使って、「管理者(admin)」と「会員(user)」を作成する方法をまとめてみた
詳しくは、heartcombo/devise のReadmeを参照
全体の流れ
devise
のインストール- installコマンドとconfigファイルの修正
admin
/user
モデルを作成admins
/users
コントローラを作成admins
/users
ビューを作成- routesの編集
- デフォルトのビューを削除
1.devise
のインストール
「devise」を「Gemfile」に追加して、インストールします。
gem 'devise'
bundle install
rails g devise:install
2.installコマンドとconfigファイルの修正
修正前を修正後に変更する
Devise がすべてのモデルに同じビューを使用しているため、別のビューを使用できるように修正している。
Readmeでいうと、Configuring viewsの部分を参考に作成してます。
::
# config.scoped_views = false
::
::
config.scoped_views = true
::
3.admin
/customer
モデルを作成
rails g devise admin
rails g devise user
rails db:migrate
4.admins
/users
コントローラを作成
rails g devise:controllers admins
rails g devise:controllers users
controller作成時に、以下の表示がされる。
「routes.rb で生成されたコントローラーのルートをオーバーライドしていることを確認してください。」とのことなので、後程 routes.rbを修正するために内容を確認しておく。
ec2-user:~/environment/hogehoge (main) $ rails g devise:controllers users
create app/controllers/users/confirmations_controller.rb
create app/controllers/users/passwords_controller.rb
create app/controllers/users/registrations_controller.rb
create app/controllers/users/sessions_controller.rb
create app/controllers/users/unlocks_controller.rb
create app/controllers/users/omniauth_callbacks_controller.rb
===============================================================================
Some setup you must do manually if you haven't yet:
Ensure you have overridden routes for generated controllers in your routes.rb.
For example:
Rails.application.routes.draw do
devise_for :users, controllers: {
sessions: 'users/sessions'
}
end
===============================================================================
5.admins
/users
ビューを作成
rails g devise:views admins
rails g devise:views users
6.「Routing」の作成
まずは、理解度を深めるためにrouteを確認する
ec2-user:~/environment/hogehoge (main) $ rails routes |grep admin
new_admin_session GET /admins/sign_in(.:format) devise/sessions#new
admin_session POST /admins/sign_in(.:format) devise/sessions#create
destroy_admin_session DELETE /admins/sign_out(.:format) devise/sessions#destroy
new_admin_password GET /admins/password/new(.:format) devise/passwords#new
edit_admin_password GET /admins/password/edit(.:format) devise/passwords#edit
admin_password PATCH /admins/password(.:format) devise/passwords#update
PUT /admins/password(.:format) devise/passwords#update
POST /admins/password(.:format) devise/passwords#create
cancel_admin_registration GET /admins/cancel(.:format) devise/registrations#cancel
new_admin_registration GET /admins/sign_up(.:format) devise/registrations#new
edit_admin_registration GET /admins/edit(.:format) devise/registrations#edit
admin_registration PATCH /admins(.:format) devise/registrations#update
PUT /admins(.:format) devise/registrations#update
DELETE /admins(.:format) devise/registrations#destroy
POST /admins(.:format) devise/registrations#create
ec2-user:~/environment/hogehoge (main) $ rails routes |grep user
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
user_password PATCH /users/password(.:format) devise/passwords#update
PUT /users/password(.:format) devise/passwords#update
POST /users/password(.:format) devise/passwords#create
cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel
new_user_registration GET /users/sign_up(.:format) devise/registrations#new
edit_user_registration GET /users/edit(.:format) devise/registrations#edit
user_registration PATCH /users(.:format) devise/registrations#update
PUT /users(.:format) devise/registrations#update
DELETE /users(.:format) devise/registrations#destroy
POST /users(.:format) devise/registrations#create
Controller#Action が同じになっている…
Actionの記載が複雑になるので、admin
とuser
でControllerが分かれるようにする
Controller#Action
をカスタマイズしたい場合は、devise_for
メソッドを介してカスタマイズする必要がある
Configuring routesを参考に作成
devise_for :admins, controllers: {
sessions: 'admins/sessions',
passwords: 'admins/passwords',
registrations: 'admins/registrations'
}
devise_for :users, controllers: {
sessions: 'users/sessions',
passwords: 'users/passwords',
registrations: 'users/registrations'
}
Controller#Action がそれぞれ変わっていることを確認
ec2-user:~/environment/hogehoge (main) $ rails routes |grep admin
new_admin_session GET /admins/sign_in(.:format) admins/sessions#new
admin_session POST /admins/sign_in(.:format) admins/sessions#create
destroy_admin_session DELETE /admins/sign_out(.:format) admins/sessions#destroy
new_admin_password GET /admins/password/new(.:format) admins/passwords#new
edit_admin_password GET /admins/password/edit(.:format) admins/passwords#edit
admin_password PATCH /admins/password(.:format) admins/passwords#update
PUT /admins/password(.:format) admins/passwords#update
POST /admins/password(.:format) admins/passwords#create
cancel_admin_registration GET /admins/cancel(.:format) admins/registrations#cancel
new_admin_registration GET /admins/sign_up(.:format) admins/registrations#new
edit_admin_registration GET /admins/edit(.:format) admins/registrations#edit
admin_registration PATCH /admins(.:format) admins/registrations#update
PUT /admins(.:format) admins/registrations#update
DELETE /admins(.:format) admins/registrations#destroy
POST /admins(.:format) admins/registrations#create
ec2-user:~/environment/hogehoge (main) $ rails routes |grep user
new_user_session GET /users/sign_in(.:format) users/sessions#new
user_session POST /users/sign_in(.:format) users/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) users/sessions#destroy
new_user_password GET /users/password/new(.:format) users/passwords#new
edit_user_password GET /users/password/edit(.:format) users/passwords#edit
user_password PATCH /users/password(.:format) users/passwords#update
PUT /users/password(.:format) users/passwords#update
POST /users/password(.:format) users/passwords#create
cancel_user_registration GET /users/cancel(.:format) users/registrations#cancel
new_user_registration GET /users/sign_up(.:format) users/registrations#new
edit_user_registration GET /users/edit(.:format) users/registrations#edit
user_registration PATCH /users(.:format) users/registrations#update
PUT /users(.:format) users/registrations#update
DELETE /users(.:format) users/registrations#destroy
POST /users(.:format) users/registrations#create
これで、管理者と会員で別々のcontrollerを利用した処理の記載ができるようになりました。
7.デフォルトのビューを削除
デフォルトで作成されるdeviseのビューは必要ないので削除
rails d devise:views
まとめ
Gemfileの使い方について、ザックリと機能に関する用語を調べて、詳しくは検索機能を用いてGithubのReadmeを確認するのが一番早そうだと思いました。
見づらいや誤っている記載等あればコメント頂けると助かりますm(__)m
参考サイト
・「devise」で「管理者(admin)」と「会員(customer)」権限を分けて認証機能を構築!
・Devise(Github)
・メソッド: ActionDispatch::Routing::Mapper#devise_for