Я пытаюсь создать что-то похожее на 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