5
9

More than 3 years have passed since last update.

[Rails]DMユーザーリスト表示

Last updated at Posted at 2020-04-18

はじめに

個人で学習のため作成しているアプリにログインユーザーが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メソッドを作成することで、綺麗に書くことができました。
最後まで読んでいただき、ありがとうございました。

5
9
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
5
9