😽
[Rails]コミュニティサイト:イベント機能 実装③個人別(mypage)イベント一覧作成
今回はイベント機能 実装 について3回目になります。
各userの、参加イベント一覧ページの作成に行きます!!!
showページに、作成者のみ一覧を表示する
参加者は他に誰が参加しているのかは見えないようにし、
イベント作成者のみが、下部のtableのように、参加予定の人たちを見れるようにします。
(レイアウトはまだできていません。泣)
- 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" %>
<%= link_to "参加予定イベント", myevent_events_path(event_type: "attended_events"), class: "btn btn-primary" %>
<%= 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" %>
<%= 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