#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.