#はじめに
個人で学習のため作成しているアプリにログインユーザーがDMを行っている相手のユーザーリストを作成しました。
その中でhelperメソッドを作成し使用したため備忘録として書きます。
今回は部屋ができた順で表示させますが、違う記事でメッセージの新しい順に表示をさせています。
[Rails]DMリストの表示順をjoinsを使用してソートする
####仕様
-
DMの部屋が存在する(過去に部屋を作成した)ユーザーを一覧で表示
-
表示内容は
- ユーザー名
- 最新メッセージの内容
- まだメッセージがなければ[ まだメッセージはありません ]と表示
-
テーブル
- user: ユーザーデータ
- room: DMを行う部屋データ
- entry: userとroomの中間テーブル
###usersテーブル
Column | Type | Options |
---|---|---|
id | integer | |
name | string |
association
- has_many :entries, dependent: :destroy
- has_many :rooms, through: :entries
###roomsテーブル
Column | Type | Options |
---|---|---|
id | integer |
association
- has_many :entries, dependent: :destroy
- has_many :users, through: :entries
- has_many :messages, dependent: :destroy
###entriesテーブル
Column | Type | Options |
---|---|---|
id | integer | |
user_id | references | foreign_key: true |
room_id | references | foreign_key: true |
association
- belongs_to :user
- belongs_to :room
###messagesテーブル
Column | Type | Options |
---|---|---|
id | integer | |
text | string | |
user_id | references | foreign_key: true |
room_id | references | foreign_key: true |
association
- belongs_to :user
- belongs_to :room
##コントローラーの編集
現在ログインしているユーザーのroomデータを全て取得します。
rooms_controller.rb
def index
@rooms = current_user.rooms
end
##helperメソッドの作成
今回はDMの相手ユーザーの名前と最新メッセージの内容を表示させます。
そのデータの取得を今回はhelperメソッドを作成して行います。
rooms_helper.rb
module RoomsHelper
# 最新メッセージのデータを取得して表示するメソッド
def most_new_message_preview(room)
# 最新メッセージのデータを取得する
message = room.messages.order(updated_at: :desc).limit(1)
# 配列から取り出す
message = message[0]
# メッセージの有無を判定
if message.present?
# メッセージがあれば内容を表示
tag.p "#{message.text}", class: "dm_list__content__link__box__message"
else
# メッセージがなければ[ まだメッセージはありません ]を表示
tag.p "[ まだメッセージはありません ]", class: "dm_list__content__link__box__message"
end
end
# 相手ユーザー名を取得して表示するメソッド
def opponent_user(room)
# 中間テーブルから相手ユーザーのデータを取得
entry = room.entries.where.not(user_id: current_user)
# 相手ユーザーの名前を取得
name = entry[0].user.name
# 名前を表示
tag.p "#{name}", class: "dm_list__content__link__box__name"
end
end
ビューの作成
DMリストからDMルームに移動できるようにします。
index.html.haml
.dm_list
- @rooms.each do |room|
.dm_list__content
= link_to room_path(room), class: "dm_list__content__link" do
.dm_list__content__link__box
%h3.dm_list__content__link__box__name
= opponent_user(room)
%p.dm_list__content__link__box__message
= most_new_message_preview(room)
おわり
以上で、DMリストを表示できました。
今までコントローラーに書いていたロジックをhelperメソッドを作成することで、綺麗に書くことができました。
最後まで読んでいただき、ありがとうございました。