Rails|グループ作成②(グループメンバーの登録)
要件
自分がグループオーナーでない場合は、グループ詳細画面に「Join this group」ボタンを表示させる
「Join this group」ボタンをクリックすると、グループに参加。
グループ一覧画面にメンバーの人数とグループ詳細画面のリストに参加したユーザとして表示される
参加中のグループの場合は「Leave this group」でグループから抜けられる
開発環境
ruby 3.1.2p20
Rails 6.1.7.4
Cloud9
前提
前回の記事の続きです。
モデルの記述
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
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])
この書き方は省略形。こちらを参照。
ルーティングを記述
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」ボタンを表示させる。
<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>
グループに参加しているメンバーの名前を表示する。
<td>
<% @group.users.each do |user| %>
<li style="list-style:none;"><%= user.name %></li>
<% end %>
</td>
groups/index ビューの記述
グループに参加しているメンバーの数を表示する。
<td><%= group.users.count %></td>
これで完成です!!
参照
Discussion