Я настроил ActionCable и работаю с общим каналом сообщений. Однако мне нужно ограничить подписку на канал одним сообщением. Как мне передать message_id в подписку?
У меня есть атрибут данных, содержащий просматриваемый/подписываемый message_id.
import consumer from "./consumer"
var get_id = $('#messages').data('message-id')
consumer.subscriptions.create({
channel: "CommentChannel", message_id: get_id
}, {
connected() {
console.info('connected to the comment channel')
},
disconnected() {
console.info('disconnected to the comment channel')
},
received(data) {
console.info(data);
$('section#comments').append(data['comment']);
}
});
class CommentChannel < ApplicationCable::Channel
def subscribed
# stream_from "message_comments"
# params['message_id'] should get passed in as subscription.create param
stream_from "message:#{ params['message_id'] }:comments"
end
def unsubscribed
end
end
class CommentRelayJob < ApplicationJob
def perform(comment)
ActionCable.server.broadcast("message:#{ comment.message_id }:comments", comment: CommentsController.render(partial: 'comments/comment', locals: { comment: comment }))
end
end
Вышеприведенный get_id не работает с
comment_channel.js:6 Uncaught ReferenceError: $ is not defined
Как я могу ограничить подписку на конкретное сообщение?
Даже простой JS не работает, потому что документ равен нулю. Этот код вызывается спустя долгое время после загрузки DOM с помощью actionable... Я не решался обернуть его обратным вызовом ready(), потому что думал, что это может вызвать другие проблемы. Но, я думаю, я попробую. Мне кажется, есть еще один способ передать значение в файл x_channel.js.
Все, что я пытаюсь, заканчивается различными ошибками, потому что документ всегда равен нулю
В итоге я получил идентификатор URL-адреса, используя
var pathArray = window.location.pathname.split('/');
var secondLevelLocation = pathArray[2];
а затем добавить это в качестве параметра в подписку
consumer.subscriptions.create({
channel: "CommentChannel",
message_id: secondLevelLocation
}, ...
насколько я могу судить, вы не можете использовать обратный вызов ready() в этом файле... независимо от того, что я пробовал, это привело к ошибке.
Он жалуется, что jQuery еще не загружен. Вы можете добавить весь этот код в готовый обратный вызов jQuery, просто используя ванильный javascript
document.getElementById('messages').dataset.messageId