1

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 応答は送信されません。

4

3 に答える 3

1

私はこのgemについてあまり経験がありませんが、次のことが役立つかもしれません:


JS

クライアント側では、JS は基本的eventlistenerにオブジェクト (ページに/ JSprivate_pubを含めるときに定義) で実行され、他のアクション (アラートの呼び出し、ページへのデータの追加など) を実行するために使用できます。private_pubgritter

バックエンドが機能しているようです。これは、苦労しているサーバーからのデータの受信と処理にすぎません。これを解決するには、次の 2 つの方法を実行できます。1)application.jsコントローラー アクションから標準の JS 呼び出しを実行するか、js ファイルを実行します。


コントローラ

ドキュメントによるとprivate_pub、JS ファイルを作成するには、次のようにする必要があります。

#app/controllers/your_controller.rb
def create
    @message = "Hello"

    respond_to do |format| 
        format.html { PrivatePub.publish_to("/messages/#{@group_id}", "alert('test')") }
        format.js #-> calls create.js.erb
    end
end 

#app/views/your_controller/create.js.erb
<% publish_to "/messages/new" do %>
  $("#chat").append("<%= j render(@messages) %>");
<% end %>

ブラウザ

#app/assets/javascripts/application.js.coffee
PrivatePub.subscribe("/messages/new", (data, channel) ->
      alert data.message.content
于 2014-01-14T10:38:43.223 に答える
1

publish_toこれは、Privat pubのメソッドにグリッター スクリプトを直接追加することで実現できました。

私のコントローラーで:

PrivatePub.publish_to 
  "/some/URI/#{entity.id}"
 ,"jQuery.gritter.add({
      image: '#{ActionController::Base.helpers.asset_path('notice.png')}'
    , sticky: true
    ,title:'#{t('some_title')}'
    , text: '#{t('some text'}' 
});"

render json: {"error"=>{"code"=>20,"msg"=>e.message},"success" => false}.to_json

基本的に、HTML レスポンスに頼ることなく PrivatePub に公開でき、意図したとおりに JSON レスポンスを返すことができました。

于 2015-03-11T15:34:35.657 に答える
0

以下のようなgon gemの助けを借りて問題を処理できると思います。

In view

<%= subscribe_to "/messages/#{@group_id}" %>

In controller

gon.group_id = @group_id
PrivatePub.publish_to("/messages/#{@group_id}", message: @message)

In messages.coffee

if gon.group_id
  PrivatePub.subscribe "/messages/#{gon.group_id}", (data, channel) ->
    jQuery.gritter.add
      image: '/assets/notice.png'
      title: 'Notification!'
      text: data.message.content

ただし、gon.group_idトラブルになることもありますので、その点は注意が必要です。

そのため、簡単でファイル内の変数に簡単にjs.erbアクセスできる方を使用することをお勧めします。controller'sjs.erb

あなたの問題に答えてくれることを願っています。

于 2015-03-10T10:47:04.963 に答える