#ruby-on-rails #actioncable #stimulusjs #view-components #stimulus-reflex
#ruby-on-rails #actioncable #stimulusjs #просмотр-компоненты #стимул-рефлекс
Вопрос:
Итак, я работаю над проектом, в котором должен быть компонент чата, такой же, как в чате linkedin, где у пользователя будут все их контакты и сообщения.
Но я перепробовал все способы работы stimulus_reflex
и view_component
создания этого chat_box
, но до сих пор у меня не было никакого прогресса.
Итак, прямо сейчас я пытаюсь создать чат с чистым action_cable, но я сомневаюсь: могу ли я использовать этот канал ('ChatRoom')
action_cable с Stimulus Reflex
? Потому что, когда мы видим, что консоль rails показывает что-то вроде этого: трансляция на StimulusReflex::Channel:1
, и я хочу транслировать на ChatRoom Channel
.
Кто-то пробовал то же самое?
Комментарии:
1. Я надеюсь, что смогу ответить на ваш вопрос, но для StimulusReflex в настоящее время лучше всего обратиться за помощью к discord discord.com/invite/XveN625
Ответ №1:
stimulus_reflex
будет использовать свой собственный канал для обновления страницы после рефлекса. Но эти обновления происходят автоматически и только для пользователя, который вызвал рефлекс. Как правило, вы не хотите прикасаться к этим частям.
Если вы хотите передать сообщение или преобразование dom после рефлекса, вы можете сделать это с помощью cable_ready
(который входит в stimulus_reflex
комплект поставки .
Итак, что-то подобное может сработать для вас:
def my_reflex
@chat = Chat.find(element.dataset[:chat_id])
message = @chat.message.create(message: element.value)
cable_ready["chatroom-#{@chat.id}"]. insert_adjacent_html(
selector: "#chat",
position: "beforeEnd",
html: ApplicationController.render(ChatMessageComponent.new(message: message))
)
end
Для получения дополнительных возможностей вы можете ознакомиться с документацией cable_ready
Комментарии:
1. Я пробовал этот способ, но у меня не получалось. Я решил работать с pure Action Cable, чтобы мой чат работал так, как ожидалось. У меня был неудачный опыт работы с reflex.
Ответ №2:
Я пока не могу комментировать, поэтому я должен написать это как ответ. Похоже, что Roland пропустил фактическую трансляцию действия cable_ready .
def my_reflex
@chat = Chat.find(element.dataset[:chat_id])
message = @chat.message.create(message: element.value)
cable_ready["chatroom-#{@chat.id}"]. insert_adjacent_html(
selector: "#chat",
position: "beforeEnd",
html:
ApplicationController.render(ChatMessageComponent.new(message: message))
)
cable_ready.broadcast
end