ユーザーと管理者、それぞれの認証処理をdeviseを使って実装します。
deviseと関係ない説明が増えないように、namespaceは分けずに実装してますが、実際0から開発する場合は分けた方が良いことが多そうです。
deviseの基本的な使い方は以下の記事を参照
【Rails】deviseが最低限使えるようになるためのポイント - Qiita
deviseをインストール
Gemfile
gem 'devise'
$ bundle install
$ rails g devise:install
config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
app/views/layouts/application.html.erb
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
Modelを作成
$ rails g devise User
$ rails g devise AdminUser
$ rails db:migrate
Controllerを作成
$ rails g devise:controllers users
$ rails g devise:controllers admin_users
Viewを作成
config/initializers/devise.rb
config.scoped_views = true
$ rails g devise:views users
$ rails g devise:views admin_users
routingを作成
config.routes.rb
Rails.application.routes.draw do
devise_for :users, controllers: {
sessions: 'users/sessions',
passwords: 'users/passwords',
registrations: 'users/registrations'
}
devise_for :admin_users, controllers: {
sessions: 'admin_users/sessions',
passwords: 'admin_users/passwords',
registrations: 'admin_users/registrations'
}
end
この時点で
http://localhost:3000/users/sign_in
http://localhost:3000/admin_users/sign_in
にアクセスして、ログイン画面が表示されることを確認。
テスト用のページを作成
$ rails g controller static_pages index
$ rails g scaffold UserPost title body
$ rails g scaffold AdminUserPost title body
$ rails db:migrate
config/routes.rb
Rails.application.routes.draw do
root to: 'static_pages#index'
resources :admin_user_posts
resources :user_posts
# 省略
end
app/views/static_pages/index.html.erb
<h2>ユーザー</h2>
<%= link_to 'ログイン', new_user_session_path %>
<%= link_to '新規登録', new_user_registration_path %>
<h2>管理者</h2>
<%= link_to 'ログイン', new_admin_user_session_path %>
<%= link_to '新規登録', new_admin_user_registration_path %>
app/views/user_posts/index.html.erb
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete %>
.
.
.
app/views/admin_user_posts/index.html.erb
<%= link_to 'ログアウト', destroy_admin_user_session_path, method: :delete %>
.
.
.
ログイン後の遷移先を修正
Userとしてログインした後にはuser_posts#index
に
AdminUserとしてログインした後にはadmin_user_posts#index
に遷移するように設定。
app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
def after_sign_in_path_for(resource)
case resource
when User
user_posts_path
when AdminUser
admin_user_posts_path
end
end
end
ログインしていないとアクセスできないようにする
Userとしてログインしている時にだけUserPost画面を表示できる
AdminUserとしてログインしている時にだけAdminUserPost画面を表示できる
ように設定。
app/controllers/user_posts_controller.rb
class UserPostsController < ApplicationController
before_action :authenticate_user!
#省略
end
app/controllers/admin_user_posts_controller.rb
class AdminUserPostsController < ApplicationController
before_action :authenticate_admin_user!
#省略
end
今回はユーザー画面、管理画面共にcontrollerが1つしかないのでこの方法で問題ないですが、実際は複数のcontrollerを作ることになるので、name_spaceを区切ってそれぞれのapplication_controller
にbefore_action
をセットした方が良いかと思います。