https://qiita.com/rhiroe/items/4c4e983e34a44c5ace27
を参考にしながらチャット機能を実装しようとしています。
room_channel.jsのspeak → message_broadcast_job.rbのperform(message)にデータが渡らない(speakのログは表示されるが、performのbyebugが実行されない)状況です。
参考記事と違う点はRoomモデルがRecruitモデルになっている点だけです。何かおかしな点がありましたら教えて頂けると幸いです。
※11/29追記
stream_from "room_channel_#{params['recruit']}"
ここでparams['recruit']が取得できておらず、ログにてRecruit(参考記事のRoom)が無いとのバリデーションエラーが発生していたので確認中です。
//room_channel.js import consumer from "./consumer"; $(function() { const chatChannel = consumer.subscriptions.create({ channel: 'RoomChannel', recruit: $('#messages').data('recruit_id') }, { connected() { console.log("connected"); }, disconnected() { }, received: function(data) { console.log("received"); return $('#messages').append(data['message']); }, speak: function(message) { console.log("message : " + message); return this.perform('speak', { message: message }); } }); $(document).on('keypress', '[data-behavior~=room_speaker]', function(event) { if (event.keyCode === 13) { console.log('enter : ' + event.target.value); chatChannel.speak(event.target.value); event.target.value = ''; return event.preventDefault(); } }); });
// room_channel.rb class RoomChannel < ApplicationCable::Channel def subscribed stream_from "room_channel_#{params['recruit']}" end def unsubscribed # Any cleanup needed when channel is unsubscribed end def speak(data) // messageを受け取り、room_channelのreceivedにブロードキャストする Message.create! content: data['message'], user_id: current_user.id, recruit_id: params['recruit'] byebug end end
# message_broadcast_job.rb class MessageBroadcastJob < ApplicationJob queue_as :default def perform(message) ActionCable.server.broadcast "room_channel_#{message.recruit_id}", message: render_message(message) byebug end private def render_message(message) ApplicationController.renderer.render partial: 'messages/message', locals: { message: message } end end
# message.rb class Message < ApplicationRecord belongs_to :recruit belongs_to :user validates :content, presence: true, length: { maximum: 200 } # createの後にコミットする { MessageBroadcastJobのperformを遅延実行 引数はself } after_create_commit { MessageBroadcastJob.perform_later self } end
rooms/new.html.erb <%= text_field_tag :content, nil, class: "form-control", data: { behavior: 'room_speaker'} %>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。