😽

[Rails]コミュニティサイト:イベント機能 実装③個人別(mypage)イベント一覧作成

2023/03/18に公開

今回はイベント機能 実装 について3回目になります。

各userの、参加イベント一覧ページの作成に行きます!!!


showページに、作成者のみ一覧を表示する

参加者は他に誰が参加しているのかは見えないようにし、
イベント作成者のみが、下部のtableのように、参加予定の人たちを見れるようにします。

(レイアウトはまだできていません。泣)

参加者に自分を含めないようにメソッドの作成

#event.rb
def attendees_for(user)
    if user.present?
      # 参加者リストから自分と投稿者を除いた参加者リストを返す
      return attendees.where.not(user: [user, creator])
    else
      return attendees
    end
  end
  • イベントに参加しているユーザーのリストを取得するために**attendees_forメソッド**作成。
    参加者に自分を含めないように設定した。(参加者リストのフィルタリング。)
  • 引数として渡されたuserに応じて、参加者リストからcreator除外することができる。

showへ追加

events/show.html.erb
:
省略
:

      <div class="card mb-3 my-3">
        <% if current_user == @event.creator %>
          <h4>参加者一覧</h4>
          <% if @event.attendees_for(current_user).any? %>
            <div class="table-responsive">
              <table class="table">
                <thead>
                  <tr>
                    <th>名前</th>
                    <th>メールアドレス</th>
                  </tr>
                </thead>
                <tbody>
                  <% @event.attendees_for(current_user).each do |attendee| %>
                    <tr>
                      <td><%= attendee.user.full_name %></td>
                      <td><%= attendee.user.email %></td>
                    </tr>
                  <% end %>
                </tbody>
              </table>
            </div>
          <% else %>
            <p>まだ参加者はいません</p>
          <% end %>
        <% end %>
      </div>
      <div class="text-center">
        <%= link_to "イベント一覧に戻る", events_path %> |
        <%= link_to "My event pageへ", myevent_events_path %>
      </div>
    </div>

view myevent

そしたら、各ユーザーのevent一覧を作成していきましょう。

以下の条件に分けて、選択して閲覧可能にします。

  • 自分が作成したイベント(開催済み・開催予定の選択肢あり)
     (=> なければ、作成してみようのリンク表示)
  • 自分が参加予定のイベント
  • ** 参加完了リスト**

ここのviewに関して、今回はJSを使わずに、railsのメソッドを使用しているため、
少々記述が長いです。

ので、参考までに。。。

bootstrapを使用するのであれば、このようなものも参考になるかと思います!

events/myevent.html.erb
<div class="container">
  <div>
    <%= flash[:notice] %>
  </div>
  <h1 class="mb-4">参加イベント一覧</h1>
  <div class="btn-group mx-2 mb-4">
    <%= link_to "自分が作成したイベント", myevent_events_path(event_type: "created_events"), class: "btn btn-primary" %>
    &nbsp;&nbsp;
    <%= link_to "参加予定イベント", myevent_events_path(event_type: "attended_events"), class: "btn btn-primary" %>
    &nbsp;&nbsp;
    <%= link_to "参加完了イベント", myevent_events_path(event_type: "past_attended_events"), class: "btn btn-primary" %>
  </div>
  <div class="mb-4">
    <% unless ["attended_events", "past_attended_events"].include?(params[:event_type]) %>
      <div class="btn-group mx-2 mb-4">
        <%= link_to "未完了", myevent_events_path(event_type: "upcoming_events"), class: "btn btn-primary active" %>
        &nbsp;&nbsp;
        <%= link_to "完了済み", myevent_events_path(event_type: "past_events"), class: "btn btn-primary" %>
      </div>
    <% end %>
  </div>
  <% if @myevents.any? %>
    <% @myevents.each do |event| %>
      <div class="card mb-3">
        <div class="card-body">
          <h5 class="card-title"><%= link_to event.event_name, event_path(event) %></h5>
          <p class="card-text"><strong>開催日:</strong><%= event.date %></p>
          <p class="card-text"><strong>参加URL : </strong><%= link_to  event.url %></p>
          <p class="card-text"><strong>開催者:</strong><%= link_to event.creator.full_name, profile_users_path(event.creator) %></p>
        </div>
      </div>
    <% end %>
    <%= paginate @myevents %>
  <% else %>
    <% unless ["attended_events", "past_attended_events"].include?(params[:event_type]) %>
      <p>作成したイベントはありません。</p>
      <%= link_to "イベントを作成してみる", new_event_path %>
    <% else%>
      <p>参加のイベントはありません</p>
    <% end %>
  <% end %>
</div>

event controller

def myevent
    if params[:event_type] == "created_events"
      @myevents = current_user.events.where(creator_id: current_user.id).page(params[:page]).per(8)
    elsif params[:event_type] == "upcoming_events"
      @myevents = current_user.events.where(creator_id: current_user.id).where("date >= ?", Time.now).page(params[:page]).per(8)
    elsif params[:event_type] == "past_events"
      @myevents = current_user.events.where("date < ?", Time.now).page(params[:page]).per(8)
    elsif params[:event_type] == "attended_events"
      @myevents = Event.joins(:attendees).where(attendees: { user_id: current_user.id }).where.not(creator_id: current_user.id).page(params[:page]).per(8)
    elsif params[:event_type] == "past_attended_events"
      @myevents = Event.joins(:attendees).where(attendees: { user_id: current_user.id }).where("date < ?", Time.now).where.not(creator_id: current_user.id).page(params[:page]).per(8)
    else
      @myevents = Event.joins(:attendees).where(attendees: { user_id: current_user.id }).page(params[:page]).per(8)
    end
  end
  • 基本的にはwhereを使用して、各params(ボタン)の設定と、そのparams(ボタン)で表示するものの,条件の絞り込みをおこなっています。
    (※ここでの paramsはviewで使用した選択ボタンに名前をつけて判別するために、使用。)
  • where.not(creator_id: current_user.id):
    creator_id がログイン中のユーザーではないイベントを選択するために使用するメソッド。

これで表示可能。
少々改善は必要なのと、viewはJSなどを使用するのも良いかと試行錯誤中です。

では、昨日は一通りできました!!!

Discussion