質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

1540閲覧

ActionCableを用いたチャットアプリの作成について

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2019/03/05 12:07

ActionCableを使用して、LINEのようなチャットアプリを作成しています。

リアルタイムでチャットできるよう実装はできたのですが、今度はグループ(model: room)別にチャットを行えるようにしたいです。
現在のテーブルは

user: name: stirng password: string image: string room_user: user: references room: references rooms: name: string image: string messages: user: references room: references content: string

ユーザーがメッセージ(model: message)を投稿した時に、user_id, room_id, content(:string)を保存し、チャットルーム(room)別にメッセージを参照できるようにしたいのですが、メッセージを投稿しても何も変化が起こりません(google chromeのデベロッパツールのコンソール内でも”connected”以外は何もありませんでした)。

コードは以下の通りです。

javascript/channels/room.js

1App.room = App.cable.subscriptions.create("RoomChannel", { 2 connected: function() { 3 console.log('connected') 4 }, 5 6 disconnected: function() { 7 console.log('disconnected') 8 }, 9 10 received: function(message) { 11 const messages = document.getElementById('messages') 12 messages.innerHTML += message 13 }, 14 15 speak: function(content, room) { 16 return this.perform('speak', { message: content, room: room}); 17 } 18}); 19 20document.addEventListener('DOMContentLoaded', function() { 21 const input = document.getElementById('chat-input') 22 const roomId = document.getElementById('room-id') 23 const button = document.getElementById('button') 24 button.addEventListener('click', function() { 25 const content = input.value 26 const room = roomId.value 27 App.room.speak(content, room) 28 input.value = ''; 29 }); 30}) 31

room.channel.js

1class RoomChannel < ApplicationCable::Channel 2 def subscribed 3 stream_from "room_channel" 4 end 5 6 def unsubscribed 7 # Any cleanup needed when channel is unsubscribed 8 end 9 10 def speak(content, room) 11 message = Message.create!( 12 user_id: current_user.id, 13 room_id: data['room'], 14 content: data['message'] 15 ) 16 template = ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message }) 17 ActionCable.server.broadcast 'room_channel', message: message[:content], room: message[:room_id] 18 end 19end 20
メッセージ投稿フォーム <div class="form-group"> <%= form_with model: @message do |f| %> <%= f.hidden_field :room_id, value: room.id, id: 'room-id' %> <div class="row"> <%= f.text_area :content, id: 'chat-input', size: '1x1',class: 'form-control offset-1 col-8' %> <%= f.submit "送信", id: 'button', class: 'btn btn-primary col-2 ml-1' %> </div> <% end %> </div>
メッセージ一覧ページ <% @room.messages.each do |message| %> <ul> <% if current_user.name === message.user.name %> <li class="current-message-body offset-3"> <p class="current-user-message"> <%= message.user.name %><br> <%= message.content %> </p> </li> <% else %> <li class="other-user-message-body"> <p class="other-user-message"> <%= message.user.name %><br> <%= message.content %> </p> </li> <% end %> </ul> <% end %>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問