railsのActionCableでユーザーとルームを作ってチャットルームを作って、そのチャットルームに入室して用がなくなったら退室して違う部屋に入ったりまた同じ部屋に入ったりといったアプリを作っています。
うまくいかないのが、部屋に入ります→チャット打ちます→正常に保存されて表示されます→退室します→別の部屋または同じ部屋に入室します→チャット打ちます→3つ打った文字が表示されます(DBに保存されるのは1回のみ)→退室します→入室します→チャット打ちます→6つ打った文字が表示されます
というように入退室を繰り返すごとに3つずつ表示される回数が増えていきます(DBは正常に保存されている)。
receivedの処理が増えていっている。
退室時に切断するような処理をいれるかんじなのでしょうか?
コードレビューお願いします。
roomという名でチャンネルを作っています。
channels/room_channel.rb class RoomChannel < ApplicationCable::Channel def subscribed stream_from 'room_channel' end def unsubscribed # Any cleanup needed when channel is unsubscribed end def speak(data) message = Message.create!(content: data['message'], user_id: data['user_id'], room_id: data['room_id']) message_temp = ApplicationController.renderer.render(partial: 'messages/message', locals: {message: message}) ActionCable.server.broadcast 'room_channel', {message_temp: message_temp, room_id: data['room_id']} end end
javascript/channels/room.js App.room = App.cable.subscriptions.create("RoomChannel", { connected: function () { }, disconnected: function () { }, received: function (data) { // ここの処理が入退室ごとに1回、3回、6回、9回と増えていってしまう。 $('#messages' + '.room_' + data['room_id']).append(data['message_temp']) }, speak: function (message, user_id, room_id) { return this.perform('speak', { message: message, user_id: user_id, room_id: room_id }); } }, $(function () { $('#input-btn').click(function () { message = $('#input-message').val(); user_id = $('#user_id').text(); room_id = $('#room_id').text(); App.room.speak(message, user_id, room_id); return $('#input-message').val(''); }); }) );
jqueryで#input-btnのボタンを押した時、#input-messageの中身を保存して表示する動きです。
チャットの部分を<div id="room_部屋番号">で囲んで部屋ごとの区別をしています。
user_idはdeviceのcurrent_userから値を持ってきています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。