Rails グループ機能の実装②

## 初めに
先日グループ機能の実装①の記事を作成しましたので
今回はその続きの機能を記事にしていきたいと思います。
初学者ですので間違いもあるかと思いますが、その際はご指摘いただけると幸いです。

##  今回の記事で出来るようになる事
作成したグループのメンバーに参加、脱退する機能

## コントローラーの作成
グループ機能の実装①でGroupUserというモデルを作成している為、
今回はgroup_usersコントローラーを作成してテーブルを作成する作業を行います。

まずはコントローラーの作成。
```
$rails g controller group_users
```

次にルーティングも加えておきます。

```config/routes.rb
  resources :groups, only: [:new, :index, :show, :create, :edit, :update] do
    # group_users(中間テーブルをネストさせる)
    resource :group_users, only: [:create, :destroy]
  end
```

先ほど作成したgroup_usersコントローラーを編集していきます。
```app/controllers/group_users_controller.rb
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ページの編集
```app/views/groups/_index.html.erb
<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>
```

上記でグループに所属しているグループユーザーの数を表示するようにしました。

```app/views/groups/show.html.erb
<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>
```


自分がグループに参加していれば、脱退ボタンを表示し、
未参加ならば参加ボタンを表示するようにしています。
また、自分がグループオーナーだった場合、


以上で完成になります。

## 最後に
最後までご覧いただきありがとうございます。
初学者なので、間違っていることや、分かりづらい箇所もあるかと思います。
何かお気づきがあれば遠慮なくご指摘頂けると幸いです。

簡単な説明となりましたが
最後までお付き合いいただきましてありがとうございました！！