consumer.subscription.create('ChatChannel', {
connected() {
},
disconnected() {
},
received() {
if (data['chat']) { // если в ответе чат, то рендерим его, иначе полагаем что он уже отрендерен
// и соответственно при создании новых сообщений вставляем их в уже готовый чат
chat.element.innerHTML = data['chat']
} else {
if (chat.hasMessagesTarget) {
chat.messagesTarget.insertAdjacentHTML('beforeEnd', data)
}
}
}
}
<div id="chat" data-controller="chat">
<div id="chat-wrapper">
<div class="chat-messages" data-target="chat.messages">
<%= render partial: 'messages/message', collection: @messages, as: :message %>
</div>
<div class="chat-message-form">
<%= render partial: 'messages/form', object: @message %>
</div>
</div>
</div>
def subscribed
stream_from 'chat_channel'
ChatBroadcastJob.perform_later // вызываю job где находится рендер чата
end
class ChatBroadcastJob < ApplicationJob
queue_as :default
def perform
ActionCable.server.broadcast("chat_channel", { chat: render_message } )
end
private
def render_message
## Пробовал таким образом ...
# @messages = Message.all
# @message = Message.new
# ChatController.render template: 'chat/show', layout: false
## И так ...
ChatController.get_chat
## Но выдает ошибку..
end
end
class ChatController < ApplicationController
def self.get_chat
@messages = Message.all
@message = Message.new
render template: 'chat/show', layout: false
end
end
[ActiveJob] [ChatBroadcastJob] [5c2e08a6-a429-4311-8342-14e8f6c5083a] Rendered chat/show.html.erb (Duration: 1.4ms | Allocations: 1485)
[ActiveJob] [ChatBroadcastJob] [5c2e08a6-a429-4311-8342-14e8f6c5083a] Error performing ChatBroadcastJob (Job ID: 5c2e08a6-a429-4311-8342-14e8f6c5083a) from Async(default) in 2.3ms: ActionView::Template::Error (No route matches {}): # ------------------ ОШИБКА
/home/n1/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/actionpack-6.0.2.1/lib/action_dispatch/journey/formatter.rb:57:in `generate'
class MessageBroadcastJob < ApplicationJob
queue_as :default
def perform(message)
ActionCable.server.broadcast "chat_channel", render_message(message)
end
private
def render_message(message)
MessagesController.render partial: 'messages/message', locals: { message: message }, layout: false
end
end