DM機能の実装(チャットルーム管理)
概要
DB設計に引き続き、オリジナルアプリのDM機能を実装していきます。
今回はチャットルーム管理機能の実装です。
実装の流れ
以下のGIF画像のように実装します。
流れとしては、
①メンタープロフィールの「チャットで相談する」ボタンを押す
②カレントユーザーとメンターの2人が属しているチャットルームを生成
③チャット画面に遷移
④チャット一覧には相手の名前が表示される
の順番で処理が行われています。
実装
まずは、roomsモデル、roomsテーブルを作成します。
% rails g model room
マイグレーションファイルはこのように設定します。name(ルーム名)は、基本的にチャット相手の名前を表示するのでnullを許可しています。
マイグレートします。
% rails db:migrate
roomsコントローラーを生成します。
% rails g controller rooms
アクションを定義します。
ルーティングを設定します。
usersテーブルとroomsテーブルは多対多の関係なので、中間テーブルを用意する必要があります。
詳細はDB設計の記事で説明しています。
中間テーブルであるroom_userを作成します。
% rails g model room_user
マイグレーションファイルを編集します。
マイグレートします。
% rails db:migrate
アソシエーションを記載します。
user.rb
room.rb
dependent: :destroyオプションは、親モデルが削除された時に子モデルも削除するというオプションです。これを追加すると、ルームを削除した時に中間テーブルの情報も削除します。
room_userのテーブルに外部キーを設定しているので、このオプションを付けないと外部キーエラーが発生します。
room_user.rb
次は、クライアント側からコントローラーへ渡す値を設定します。
今回のアプリでは、メンタープロフィールの詳細画面に、チャットルーム作成のリンクをとなるボタンを配置しています。
コードは以下の通りです。
rooms_pathのmethod: :postを指定することで、roomsコントローラーのcreateアクションにつながります。
ここの部分でuser_idsをキーとして、[自分のid,相手のid]という配列を渡しています。
createアクションを作成します。
Roomクラスのインスタンスが生成、保存された時、パラメーターで受け取ったuser_idsが中間テーブルに保存されます。
つまり、user_ids: [1,2]というパラメーターを受け取ったとすると、
roomsテーブルにはid:1のルームのレコードが保存され、room_usersテーブルには、room_id:1、user_id:1のレコードとroom_id:1、user_id:2のレコードが保存されることになります。
user_idsを受け取るためのストロングパラメーターも設定します。
この処理が終わった後、メッセージ一覧画面に遷移しています。(Messageのルーティングは未設定のためこのままではエラーが出ます)
次は、チャットルーム一覧画面の表示です。
チャットルーム一覧部分のコードは以下の通りです。
この部分でまず、自分の属しているルームを全て取り出してeach文で1つずつ処理します。
ここでチャット相手の名前が表示されるようになっています。
仕組みとしては、@another_userに、そのルームの自分ではない方のユーザー(つまりチャット相手)の情報を代入して、その名前を表示するようにしています。
これで、チャットルーム管理の基本的な実装は完了です。
メッセージ送信機能に関しては別の記事で説明します。