LoginSignup
0
0

Rails グループ機能の実装②

Posted at

初めに

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

 今回の記事で出来るようになる事

作成したグループのメンバーに参加、脱退する機能

コントローラーの作成

グループ機能の実装①で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>

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

以上で完成になります。

最後に

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0