Как я могу использовать пользовательский кабель канала действия со стимульным рефлексом и компонентом просмотра?

#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