Rails Live: динамическая отправка результатов из метода в браузер

#javascript #ruby-on-rails #ruby #event-handling #dom-events

#javascript #ruby-on-rails #ruby #обработка событий #dom-события

Вопрос:

Я пытаюсь уведомить браузер пользователя об изменении статуса модели. Для этого я пытаюсь использовать live-модуль Rails. Вот что у меня есть до сих пор:

 require 'json'
class Admin::NotificationsController < ActionController::Base
  include ActionController::Live

  def index
    puts "sending message"
    videos = Video.all
    response.headers['Content-Type'] = 'text/event-stream'
    begin
      if(params[:id].present?)
        response.stream.write(sse({id: params[:id]},{event: "video_encoded"}))
       end
    rescue IOError

    ensure
      response.stream.close
    end
  end

  private
    def sse(object, options = {})
      (options.map{|k,v| "#{k}: #{v}" } << "data: #{JSON.dump object}").join("n")   "nn"
    end
end
 

Идея вышеупомянутого контроллера заключается в том, что когда его URL-адрес вызывается с параметром, он отправляет этот параметр (в данном случае идентификатор) пользователю. Вот как я пытаюсь вызвать контроллер:

 notifications_path(id: video.id)
 

К сожалению, однако, следующий прослушиватель событий в браузере не запускается, даже если я использую curl для запуска события:

  var source = new EventSource('/notifications');
 source.addEventListener("video_encoded", function(event) {
   console.log("message")
   console.log(event)
 });
 

Цель этого в том, что я хочу добавить dom-элемент на определенную страницу (позже), если есть изменения. Может быть лучший способ, но Ruby Live показался подходящим решением. Приветствуются любые советы или предложения по другому подходу.

Комментарии:

1. Ваш вариант использования не похож на допустимый вариант использования для ActionController::Live . Вы не отправляете потоковый вывод в браузер. Вы выполняете одноразовую проверку идентификатора и отправляете вывод JSON.

2. Что было бы лучшим способом справиться с этим тогда?

3. Используйте обычный контроллер

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

5. используйте AJAX и обновляйте DOM при успешном обратном вызове.

Ответ №1:

Ваш вариант использования не похож на допустимый вариант использования для ActionController::Live . Вы не отправляете потоковый вывод в браузер. Вы выполняете одноразовую проверку идентификатора и отправляете вывод JSON.

Используйте обычный контроллер и получайте запрос с помощью AJAX вместо EventSource.