Обновить турбо-тег из задания, выполняющего трансляции.

Вопрос или проблема

У меня есть приложение, которое показывает пользователю некоторые данные через простую веб-страницу. Страница содержит текстовое поле, которое отображает некоторые логи.

Логи сохраняются в активной записи в задании Rails периодически, и я хочу показывать все данные пользователю, просто обновляя текстовое поле, а не всю страницу. Текстовое поле связано с активной записью.

Поэтому я попадаю в цикл в задании, я сохраняю данные в активной записи и хочу, чтобы текстовое поле обновлялось. Есть ли способ частично обновить текстовое поле, содержащее логи?

Я читал о морфировании турбо-рамки, но как можно инициировать морфирование через трансляцию Turbo:Channel?

https://turbo.hotwired.dev/handbook/page_refreshes#turbo-frames

Например, в своем задании я могу сделать вот так, где {dom_id(message) – это мой текстовый тег turbo, но это слишком сложно:

Turbo::StreamsChannel.broadcast_append_to("partial_message",
            target: "#{dom_id(message)}",
            html:   "#{{result.to_s.squish}\n")

Спасибо.

Ответ или решение

Чтобы обновить текстовое поле на веб-странице с логами без перезагрузки всей страницы, вы можете использовать функционал Turbo Streams в вашем Ruby on Rails приложении. Этот подход не только повышает пользовательский опыт, но и упрощает реализацию благодаря интеграции с ActionCable для передачи данных в реальном времени.

1. Основные компоненты

Active Record

На первом этапе убедитесь, что ваши логи сохраняются в таблице базы данных через модель. Ваше поле, которое должно обновляться, будет связано с определённым объектом Active Record.

Turbo Frame

Поскольку вам необходимо обновлять только текстовое поле (textarea), вам следует использовать Turbo Frame для его обёртки. Пример:

<%= turbo_frame_tag dom_id(@message) do %>
  <textarea id="<%= dom_id(@message) %>"><%= @message.content %></textarea>
<% end %>

2. Реализация обработки в бэкэнде

Существует необходимость в создании фоновой задачи, которая будет обрабатывать логи и отправлять обновления. В этом случае мы воспользуемся Turbo::StreamsChannel, чтобы отправить обновления новым данным в текстовое поле.

Ваша фоновая задача может выглядеть следующим образом:

class LogJob < ApplicationJob
  queue_as :default

  def perform
    new_log = save_new_log # Это функция, которая будет сохранять новый лог
    Turbo::StreamsChannel.broadcast_replace_to(
      "partial_message", 
      target: "#{dom_id(new_log)}", 
      html: new_log.content
    )
  end
end

3. Настройка Turbo Channels

Теперь необходимо настроить Turbo Streams Channel, чтобы он мог принимать входящие данные и обновлять содержимое текстового поля.

Создайте файл app/channels/turbo_streams_channel.rb:

class TurboStreamsChannel < ApplicationCable::Channel
  def subscribed
    stream_from "partial_message"
  end
end

4. Внедрение в JavaScript

Чтобы ваша страница могла реагировать на изменения, убедитесь, что Turbo установлено и подключено к вашему JavaScript. Это обеспечит автоматическое обновление текстового поля каждый раз, когда приходит новое сообщение через ActionCable.

Как только данные поступят в Turbo Streams Channel, они будут обновлять содержимое текстовой области автоматически.

5. Проверка результата

Теперь, когда все компоненты настроены, тестируйте фоновую задачу и ожидайте обновления текстового поля в вашем веб-приложении. Запустите задачу и убедитесь, что содержимое текстового поля обновляется без необходимости перезагрузки страницы.

Заключение

Используя Turbo Streams вместе с ActionCable, вы сможете выполнять частичное обновление текстового поля логов в вашем Rails приложении, что значительно улучшит взаимодействие пользователя с системой. Этот подход обеспечивает высокую производительность и масштабируемость, что необходимо для современных веб-приложений.

Оцените материал
Добавить комментарий

Капча загружается...