FreeCamp      

【Rails】Gem deviseで管理者とユーザーの作成②

目次

  1. ユーザー認証機能・投稿機能
  2. 管理者追加
  3. 管理者とユーザーで画面を分ける
  4. 権限付与
  5. 完成ソースコード

前回までで目次の3の途中まで終わりました。
この記事では管理者画面を充実させてから4に移ります。
ユーザー閲覧・編集・詳細画面のファイル、投稿閲覧・編集・詳細画面のファイルは作成してあるので、
コードを書いていきます。
まずはユーザー一覧画面からです。

...編集
def index
  @users = User.all
end
<h2>ユーザー一覧</h2>
<% @users.each do |user| %>
  <p><%= "id: #{user.id} name: #{user.name} email: #{user.email} " %><%= link_to "Edit", edit_admins_user_path(user) %> <%= link_to "Show", admins_user_path(user) %></p>
<% end %>

次にユーザー詳細画面です。

...編集
def show
  @user = User.find(params[:id])
end
<h2>ユーザー詳細画面</h2>
<p><%= "id: #{@user.id} name: #{@user.id} email: #{@user.id}"%><%= link_to "Back", admins_users_path %> <%= link_to "Edit", edit_admins_user_path(@user) %></p>

<% @user.posts.each do |post| %>
  <p><%= "title: #{post.title} content: #{post.content}" %></p>
<% end %>

次に編集画面です。

...編集
def edit
  @user = User.find(params[:id])
end
<%= form_with(model: @user, url: admins_user_path(@user)) do |f| %>
  <%= f.text_field :name %>
  <%= f.email_field :email %>
  <%= f.submit %>
<% end %>

編集画面はできたので、updateアクションを作成します。

def update
  @user = User.find(params[:id])
  @user.update(user_params)
  redirect_to admins_users_path
end

private

def user_params
  params.require(:user).permit(:name, :email)
end

これでユーザー関連について完成しました。
次に投稿関連についてコードを書いていきます。
まずは投稿一覧画面からです。

def index
  @posts = Post.all
end
<h2>投稿一覧</h2>
<% @posts.each do |post| %>
  <p><%= "id: #{post.id} title: #{post.title} content: #{post.content} "%><%= link_to "Show", admins_post_path(post) %> <%= link_to "Edit", edit_admins_post_path(post) %></p>
<% end %>
def show
  @post = Post.find(params[:id])
end
<h2>ユーザー詳細画面</h2>
<p><%= "id: #{@user.id} name: #{@user.id} email: #{@user.id}"%><%= link_to "Back", admins_users_path %> <%= link_to "Edit", edit_admins_user_path(@user) %></p>

<% @user.posts.each do |post| %>
  <p><%= "title: #{post.title} content: #{post.content}" %></p>
<% end %
def edit
  @post = Post.find(params[:id])
end
<%= form_with(model: @user, url: admins_user_path(@user)) do |f| %>
  <%= f.text_field :name %>
  <%= f.email_field :email %>
  <%= f.submit %>
<% end %

編集画面はできたので、updateアクションを作成します。

def update
  @post = Post.find(params[:id])
  @post.update(post_params)
  redirect_to admins_posts_path
end

private

def 
  params.require(:post).permit(:title, :content)
end

管理者の投稿関連が完成しました。
そして、管理者の概ねの機能が完成しました。
ここまで長い道のりでしたが、あくまでも機能が完成したのみです。
レイアウトやリンク等の表示は最小限に抑えているため、
ここまで実装できたらcss, scssでカスタマイズすることをお勧めします。

4. 権限付与

管理者の機能は管理者、ユーザーの機能はユーザーしか使用できないように設定を追加していきます。
今のままだとURLを叩くとユーザーでも管理者の機能が使えてしまいます。
ですので、コントローラに設定を記述していきます。

class Admins::PostsController < ApplicationController
  before_action :authenticate_admin!
class Admins::UsersController < ApplicationController
  before_action :authenticate_admin!

これで権限設定ができました。
ひとまず完成とします。

5. 完成ソースコード

https://github.com/ssshhhooota/rails_devise_admin