チャット機能の完成イメージ
それぞれ別のブラウザウィンドウを開き、異なるユーザーとしてログインしていますが、互いにリアルタイムでチャットができます。
実装方法
前提として、今回は上のようにUser
モデルとChat
モデルの2つを作成します。
User
モデルとChat
モデルは1対多の関係
Chat
モデルのpartner_id
はチャット相手
User
モデルは「devise」の認証モデルとして作成
1. deviseでログイン認証機能を実装
まず「devise」というgemを使い、User
モデルを作成しつつログイン認証機能を実装します。
詳しくは以下の記事を参考にしてください。
ruby/rails-devise)
2. Chatモデルの作成
3. モデル間の関連付け
4. マイグレーション実行
5. コントローラー作成
index
アクションでトークルーム一覧、show
アクションでチャットルームのやりとりを表示しています。
9行目以降は「送信したのが自分、もしくは送信されたのが自分」なチャットを取得し、それらのモデルオブジェクト達を結合させています。
6. ビューの作成
トークルーム一覧を表示するindex.html.erb
を作成します。
次にトークルームを表示するshow.html.erb
を作成します。
7. チャット画面のスタイリング
チャット画面をLINE風にスタイリングします。
localhost:3000/users/showにアクセスし、フォームに入力してボタンを押してリロードします。
すると先ほど投稿したメッセージが表示され、これで単方向の送信は実現できました。
8. jQueryを使えるようにする
まずgemをインストール。
application.js
に上のように追記することでjQueryが使えるようになります。
9. Chatチャンネルを作成
これでchat.js
とchat_channel.rb
が生成されます。
chat.js
にはフロント側の処理を、chat_channel.rb
にはサーバ側の処理を書いていきます。
10. ログイン中のユーザーを取得
channels/applicationcable/connection.rb
を上のように実装。
これでChatChannel
でcurrent_user
が呼べるようになり、ログインしているユーザーを取得できるようになります。
11. chat.jsの実装
- 送信ボタンがクリックされたら
speak
メソッドを呼び出す
speak
メソッドでは色々値を取得してサーバ側のspeak
メソッドに渡している
recieved
メソッド以降はサーバから値を受けとり、要素を追加している(チャットの内容を表示している)
今画面を開いているのがチャットを送信したユーザーなら右に、受信したユーザーなら左に吹き出しを追加しています。
12. chat_channel.rbの実装
chat_channel.rb
で、フロント側から送られてきたデータを元にチャットのレコードを作成・保存します。
subscribed
メソッドは接続が確立された時の処理。stream_for
でcurrent_user.id
を指定することで、今画面開いているユーザーに関連するストリームを作成
broadcast_to
で今画面開いているユーザーがチャット送信者なのか否かを判定し、送信するデータ(isCurrent_user
の値)を変更
双方向のチャットができるようになりました。これで完成です 🎉
12