🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Action Cable

Action Cableは、WebSocketをRailsに組み込む機能。Rails4でオプションとして存在していたWebSocketをRails5で標準機能したものです。Railsアプリケーションと同様のスタイルで、Rubyを用いたリアルタイム機能を記述できます。

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

1204閲覧

Rails ActionCableを用いたチャット機能でjsからjob側に変数を渡す(チャット機能で相手と自分の判定を行いたい)

lyzmfeqpxs54

総合スコア237

Action Cable

Action Cableは、WebSocketをRailsに組み込む機能。Rails4でオプションとして存在していたWebSocketをRails5で標準機能したものです。Railsアプリケーションと同様のスタイルで、Rubyを用いたリアルタイム機能を記述できます。

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/01/06 03:43

編集2021/01/06 03:43

いつもお世話になっております。
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

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

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

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

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

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

guest

回答1

0

コネクションの設定でログインユーザーを取得し、それを元にjobでuser_id相当のものが使えると思います。ログイン機構に何を使われているのかわかりませんので、これ以上のアドバイスはできませんが、Railsガイドのドキュメントを参考に進めてみてください。

投稿2021/01/06 14:43

Mugheart

総合スコア2349

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問