private_pubを使用して、Facebook に似たプッシュ通知システムを複製しようとしています。理想的には、これをリンクして、グリッターなどの宝石を使用して通知を表示したいと思います(他の宝石の提案は大歓迎です)
コントローラーから特定のアクションが呼び出されるたびに、特定の ID の一部であるすべてのサブスクライバーに通知を送信したいと考えています。ログインしている限り、レイアウトに を配置することで、チャンネルに登録され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 を使用します。ただし、単純なアラートを取得できません(おそらくチャネルのIDが原因です)
この質問では、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 応答です。2 つの応答をレンダリングできないため、js.erb のみが呼び出されますが、JSON 応答は送信されません。