初めに
先日グループ機能の実装①の記事を作成しましたので
今回はその続きの機能を記事にしていきたいと思います。
初学者ですので間違いもあるかと思いますが、その際はご指摘いただけると幸いです。
今回の記事で出来るようになる事
作成したグループのメンバーに参加、脱退する機能
コントローラーの作成
グループ機能の実装①でGroupUserというモデルを作成している為、
今回はgroup_usersコントローラーを作成してテーブルを作成する作業を行います。
まずはコントローラーの作成。
$rails g controller group_users
次にルーティングも加えておきます。
resources :groups, only: [:new, :index, :show, :create, :edit, :update] do
# group_users(中間テーブルをネストさせる)
resource :group_users, only: [:create, :destroy]
end
先ほど作成したgroup_usersコントローラーを編集していきます。
class GroupUsersController < ApplicationController
def create
# 自分のIDを持ったgroup_userを作成する。作成時にgroup_idカラムにグループ詳細ページのIDを保存する。
group_user = current_user.group_users.new(group_id: params[:group_id])
group_user.save
redirect_to request.referer
end
def destroy
# 自分のIDを持ったgroup_userの中からさらに、group_idカラムのデータがグループ詳細ページと一緒のデータを探す。
group_user = current_user.group_users.find_by(group_id: params[:group_id])
group_user.destroy
redirect_to request.referer
end
end
解説しますと
createでは
group_user = current_user.group_users.new(group_id: params[:group_id])では
user_idにcurrent_userのidを保存し、group_idにparams[:group_id]を保存してgroup_userを作成しています。
※groupにネストをしている為、params[:group_id]と記述する事でgroup_idを取得することができます。
destroyでも同様でgroup_usersテーブルの中から、user_idが自分でgroup_idにparams[:group_id]が保存されているデータを探し、それを削除しています。
Viewページの編集
<table class="table table-hover table-inverse">
<thead>
<tr>
<th></th>
<th>グループ名</th>
<th>紹介文</th>
<th>メンバー数</th>
</tr>
</thead>
<tbody>
<% groups.each do |group| %>
<tr>
<td><%= image_tag group.get_image, size:"50x50" %></td>
<td><%= link_to group.name, group_path(group) %></td>
<td><%= group.introduction %></td>
<td><%= group.group_users.count %></td>
</tr>
<% end %>
</tbody>
</table>
上記でグループに所属しているグループユーザーの数を表示するようにしました。
<div class='col-md-8 offset-md-1'>
<h2>Group Detail</h2>
<table class="table table-hover table-inverse">
<thead>
<tr>
<th></th>
<th>グループ名</th>
<th>紹介文</th>
<th>メンバー</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<tr>
<td><%= image_tag @group.get_image, size:"100x100" %></td>
<td><%= @group.name %></td>
<td><%= @group.introduction %></td>
<td>
<!-- @groupは中間テーブルを挟んでusersテーブルを見ている。-->
<% @group.users.each do |member| %>
<li style="list-style: none;"><%= member.name %></li>
<% end %>
</td>
<td>
<!-- @groupに紐づいたgroup_user(user_idカラムに自分のIDを持っている)があるかどうかを確かめる。-->
<% if @group.group_users.exists?(user_id: current_user.id) %>
<!-- group_usersコントローラーの#destroyアクションを発動 @groupからgroup_user(自分)を消す -->
<%= link_to 'Leave this group', group_group_users_path(@group), method: :delete, class: "btn btn-sm btn-danger" %>
<% else %>
<!-- group_usersコントローラーの#createアクションを発動 @groupにgroup_user(自分)を追加する -->
<%= link_to 'Join this group', group_group_users_path(@group), method: :post, class: "btn btn-sm btn-success" %>
<% end %>
</td>
<td>
<% if @group.owner_id == current_user.id %>
<%= link_to 'Edit', edit_group_path(@group), class: "btn btn-sm btn-success" %>
<% end %>
</td>
</tr>
</tbody>
</table>
</div>
自分がグループに参加していれば、脱退ボタンを表示し、
未参加ならば参加ボタンを表示するようにしています。
また、自分がグループオーナーだった場合、
以上で完成になります。
最後に
最後までご覧いただきありがとうございます。
初学者なので、間違っていることや、分かりづらい箇所もあるかと思います。
何かお気づきがあれば遠慮なくご指摘頂けると幸いです。
簡単な説明となりましたが
最後までお付き合いいただきましてありがとうございました!!