Я пытаюсь воспроизвести систему push-уведомлений, аналогичную системе Facebook, используя private_pub. В идеале я хотел бы связать это, чтобы показывать уведомления с помощью драгоценного камня, такого как gritter (другие предложения драгоценного камня приветствуются )
Всякий раз, когда вызывается определенное действие от контроллера, я хочу отправить уведомление всем подписчикам, которые являются частью определенного идентификатора. Пока вы вошли в систему, вы подписаны на канал, что достигается путем размещения subscribe_to
в макетах.
в представлении:
<%= subscribe_to "/messages/#{@group_id}" %>
в контроллере
PrivatePub.publish_to("/messages/#{@group_id}", "alert('test')")
это работает просто отлично, однако я хотел бы иметь что-то более сложное, чем alert
в качестве ответа (например, уведомление о песочнице), поэтому вместо этого:
PrivatePub.publish_to("/messages/#{@group_id}", data: @some_data)
Следуя руководству, они используют для этого coffeescript. Однако я не могу получить простое оповещение (вероятно, из-за идентификатора в канале)
В это вопрос, OP смог решить эту проблему, используя представление js.erb. Но я не могу заставить его работать.
Отказ от ответственности: мои знания js и coffeescript почти равны нулю.
Любая помощь приветствуется :)
ИЗМЕНИТЬ
Еще немного информации: у меня есть метод в контроллере, который является частью общедоступного API и ожидает запроса POST. Если все в порядке, он отправляет ответ об успешном завершении JSON. Кроме того, этот же метод отправляет уведомление всем пользователям определенной группы.
Мне действительно удалось заставить это работать, поместив это в контроллер:
метод обратного вызова:
respond_to do |format|
format.js #-> calls callback.js.erb
#format.json { render json: {"success" => true}.to_json }
end
и поместите песчинки в my_api_controller/callback.js.erb
:
<% publish_to "/messages/#{@group_id}" do %>
<%= add_gritter(
"Nova " + link_to("reserva", reservation_path(@r)) + " de #{@channel} para " +
link_to(@hostel_name, hostel_path(@hostel_id)),
:title => "Nova reserva!",
:sticky => true,
:image => :notice
) %>
<% end %>
примечание: так как подписка на канал делается в каждом просмотре (через макет), вы можете получать уведомление на любой странице/просмотре
Моя проблема на данный момент, как вы можете догадаться, это ответ JSON. Поскольку я не могу отобразить два ответа, вызывается только js.erb, но ответ JSON никогда не отправляется