📝

Rails|グループ作成②(グループメンバーの登録)

2023/08/06に公開

要件

自分がグループオーナーでない場合は、グループ詳細画面に「Join this group」ボタンを表示させる
「Join this group」ボタンをクリックすると、グループに参加。
グループ一覧画面にメンバーの人数とグループ詳細画面のリストに参加したユーザとして表示される
参加中のグループの場合は「Leave this group」でグループから抜けられる

開発環境

ruby 3.1.2p20
Rails 6.1.7.4
Cloud9

前提

前回の記事の続きです。
https://zenn.dev/airiin/articles/238e9cbb6293cb

モデルの記述

group.rb
  has_many :users, through: :group_users, source: :user

  def include_user?(user)
    group_users.exists?(user_id: user.id)
  end

has_many :users, through: :group_users, source: :user
group.users で グループメンバーが取得できるように、アソシエーションを記述。

include_user?(user)
このメソッドで、あるグループに user_idが user.id のユーザーが存在するかどうかを確認。
存在しない場合は「Join this group」ボタンを、
存在する場合は「Leave this group」ボタンを記述するため。

コントローラの作成

$ rails g controller group_users
group_users_controller.rb
class GroupUsersController < ApplicationController
  before_action :authenticate_user!

  def create
    group_user = current_user.group_users.new(group_id: params[:group_id])
    group_user.save
    redirect_to request.referer
  end

  def destroy
    group_user = current_user.group_users.find_by(group_id: params[:group_id])
    group_user.destroy
    redirect_to request.referer
  end
end

group_usersコントローラでは、
ユーザーがグループに所属したり、グループから抜けたりするアクションを追加する。

group_user = current_user.group_users.new(group_id: params[:group_id])
この書き方は省略形。こちらを参照。
https://zenn.dev/airiin/articles/d278abcd6ba0c4

ルーティングを記述

config/route.rb
  resources :groups, only: [:new, :index, :show, :create, :edit, :update] do
    resource :group_users, only: [:create, :destroy]
  end

group_usersのidは不要なため、groupsにネストする。

groups/show ビューの記述

自分が作成者の場合は「Edit」
自分がグループに参加している場合は「Leave this Group」
自分がグループに未参加の場合は「Join this Group」ボタンを表示させる。

groups/show.html.erb
            <td>
              <% if @group.owner_id == current_user.id %>
                <%= link_to "Edit", edit_group_path(@group), class: "btn btn-success" %>
              <% else %>
                <% if @group.include_user?(current_user) %>
                  <%= link_to "Leave this group", group_group_users_path(@group), method: :delete, class: "btn btn-danger" %>
                <% else %>
                  <%= link_to "Join this group", group_group_users_path(@group), method: :post, class: "btn btn-success" %>
                <% end %>
              <% end %>
            </td>

グループに参加しているメンバーの名前を表示する。

groups/show.html.erb
            <td>
                <% @group.users.each do |user| %>
                  <li style="list-style:none;"><%= user.name %></li>
                <% end %>
            </td>

groups/index ビューの記述

グループに参加しているメンバーの数を表示する。

groups/index.html.erb
      <td><%= group.users.count %></td>

これで完成です!!

参照

https://zenn.dev/goldsaya/articles/00e083c805b1b1

Discussion