いつもお世話になっております。
RailsのActionCableを用いてチャット機能のようなものを作っております。
自分の発言なのか相手の発言なのかを判定するために、current_userのuserid情報をapp/jobs/message_broadcast_job.rb値をに渡すことができずこちらに質問させていただきました。。
message_broadcast_job.rb内ではcontrollerで定義した変数@user = User.find_by(id: session[:use_id])やparamsなど、Rubyメソッドが使えないので、こちらに何らかの形で渡すにはどのようにすればよろしいのでしょうか。
参考になるサイトでも構いませんので、適切な方法をご教示いただけますと幸いです。
よろしくお願いいたします。
環境
Amazon Linux release 2 (Karoo)
Rails 5.2.3
Ruby version: 2.6.1
ruby
1 2# channnels/application_cable/message_channel.rb 3 4class MessageChannel < ApplicationCable::Channel 5 def subscribed 6 stream_from "message_channel_#{params[:room]}" 7 end 8 9 def unsubscribed 10 # Any cleanup needed when channel is unsubscribed 11 end 12 13 def post_message(data) 14 # DBに保存 15 Message.create! message: data['message'], user_id: params[:user_id], messageroom_id: params[:room] 16 end 17end 18 19 20 21 22# app/jobs/message_broadcast_job.rb 23 24class MessageBroadcastJob < ApplicationJob 25 queue_as :default 26 27 def perform(message) 28 ActionCable.server.broadcast "message_channel_#{message.messageroom_id}", message: render_message(message) 29 end 30 31 private 32 def render_message(message) 33 ApplicationController.renderer.render partial: 'messages/message', 34 locals: { messages: message, user_id: message.jsのuser_idをここで使いたい } 35 end 36end 37 38 39 40# _message.html.erb 41# ↓のような形で判定したい 42 43<% if user_id == message.user_id %> 44 <div class="right"> 45 <p><%= message.content %></p> 46 </div> 47 <% else %> 48 <div class="left"> 49 <p><%= message.content %></p> 50 </div> 51 <% end %> 52
javascript
1 2App.chat = App.cable.subscriptions.create({ channel: 'MessageChannel', user_id: $('#messages').data('user_id'), room: $('#messages').data('room_id') }, { 3// const chatChannel = consumer.subscriptions.create({ channel: 'RoomChannel', room: $('#messages').data('room_id') }, { 4 connected: function(){ 5 //called when the subscription is ready for use on the server 6 }, 7 8 disconnected: function(){ 9 //called when the subscription has been terminated by the server 10 }, 11 12 received: function(data){ 13 $('#messages').append(data['message']); 14 var obj = document.getElementById('messages'); 15 obj.scrollTop = obj.scrollHeight; 16 }, 17 // これが実行されるとコンシューマになったRoomChannel#speak({ message: message })が呼ばれる 18 post_message: function(message) { 19 return this.perform('post_message', { 20 message: message, 21 user_id: $('#messages').data('user_id') 22 // ↑のuser_idを何らかの形でjob側に渡したい 23 }); 24 } 25}); 26 27 28$(document).on('keypress', '[data-behavior~=post_chat]', function(event) { 29 if (event.keyCode === 13) { 30 App.chat.post_message(event.target.value); 31 event.target.value = ''; 32 return event.preventDefault(); 33 } 34}); 35
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。