前提・実現したいこと
rails6でactioncableとbroadcastでLineのグループ機能のようなものを作っています
現段階ではチャット機能はできていて
非同期処理の中でifを使ってメッセージの送信者と見ている人のidを比較し、送信者と見ている人でメッセージの見え方を変えたいです
発生している問題・エラーメッセージ
broadcast(非同期)内で'gem devise'のヘルパーメソッドのcurrent_userで値を取りたいのですがうまくいきません
html
1<div class="message"> 2 <% if message.user_id == #current_user.id# %> 3 ... 4 <% else %> 5 ... 6 <% end %> 7</div>
該当のソースコード
broadcastjob
1class MessageBroadcastJob < ApplicationJob 2 queue_as :default 3 4 def perform(message) 5 ActionCable.server.broadcast "room_channel_#{message.room_id}", message: render_message(message) 6 end 7 8 private 9 10 def render_message(message) 11 ApplicationController.renderer.render partial: 'messages/message', locals: { message: message } 12 end 13end
channelRuby
1class RoomChannel < ApplicationCable::Channel 2 def subscribed 3 stream_from "room_channel_#{params['room']}" 4 end 5 6 def unsubscribed 7 # Any cleanup needed when channel is unsubscribed 8 end 9 10 def speak(data) 11 Message.create!(content: data['message'], user_id: current_user.id, room_id: params['room']) 12 end 13end 14
channelJS
1import consumer from "./consumer" 2 3$(function() { 4 const chatChannel = consumer.subscriptions.create({ channel: 'RoomChannel', room: $('#messages').data('room_id') }, { 5 connected() { 6 // Called when the subscription is ready for use on the server 7 }, 8 9 disconnected() { 10 // Called when the subscription has been terminated by the server 11 }, 12 13 received: function(data) { 14 return $('#messages').append(data['message']); 15 }, 16 17 speak: function(message) { 18 return this.perform('speak', { 19 message: message 20 }); 21 } 22 }); 23 24 $(document).on('keypress', '[data-behavior~=room_speaker]', function(event) { 25 if (event.keyCode === 13) { 26 chatChannel.speak(event.target.value); 27 event.target.value = ''; 28 return event.preventDefault(); 29 } 30 }); 31});
試したこと
current_userの値を非同期で取れないか試行錯誤しています
補足情報(FW/ツールのバージョンなど)
cloud9 ubuntu
rails6
ruby 2.6.3
devise 4.7.1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。