Как установить параметры при подписке на канал ActionCable - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь создать что-то похожее на Facebook Messenger или обмен текстовыми сообщениями, где для каждого чата создается один чат для двух пользователей.

Для этого мне нужно передать conversation_id в coffeescript. Я подумал, что могу использовать параметр, так как он находится в URL для чата. Это не работает Когда я это делаю, терминал говорит MessagesChannel is streaming from conversation__channel, а не MessagesChannel is streaming from conversation_1_channel et c ...

Как установить этот параметр, чтобы он мог использоваться в трансляции ActionCable?

channel / application_cable / connection.rb

module ApplicationCable
 class Connection < ActionCable::Connection::Base
  identified_by :current_user

  def connect
   self.current_user = find_verified_user
   logger.add_tags 'ActionCable', current_user.username
  end

  protected
  def find_verified_user
   verified_user = env['warden'].user
   if verified_user
    verified_user
   else
    reject_unauthorized_connection
   end
  end
 end
end

assets / javascripts / messages.coffee

App.messages = App.cable.subscriptions.create "MessagesChannel",
 connected: ->
  console.log 'Connected'

 disconnected: ->
  console.log 'Disconnected'

 received: (data) ->
  console.log 'Received'
  $('#messages').append data['message']

 speak: (message, conversation_id) ->
  @perform 'speak', message: message, conversation_id: params["conversation_id"]

$(document).on 'turbolinks:load', ->
 submit_message()
 scroll_bottom()

submit_message = () ->
 $('#response').on 'keydown', (event) ->
  if event.keyCode is 13
   App.messages.speak(event.target.value)
   event.target.value = ""
   event.preventDefault()

scroll_bottom = () ->
 $('#messages').scrollTop($('#messages')[0].scrollHeight)

channel / messages_channel .rb

class MessagesChannel < ApplicationCable::Channel
 def subscribed
  stream_from "conversation_#{params['conversation_id']}_channel"
 end

 def unsubscribed
  stop_all_streams
 end

 def speak(data)
  Message.create! body: data['message'], conversation_id: data['conversation_id'], user_id: current_user.id
 end
end

models / message.rb

class Message < ApplicationRecord
 after_create_commit { MessageBroadcastWorker.perform_async self.id }
end

working / message_broadcast_worker.rb

class MessageBroadcastWorker
 include Sidekiq::Worker

 def perform(message_id)
  message = Message.find message_id
  ActionCable.server.broadcast("conversation_#{params['conversation_id']}_channel", message: render_message(message))
 end

 private
 def render_message(message)
  ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message })
 end
end
...