1

アプリケーションコントローラーにアクションがありますapplication_controller.rb

before_filter :activity

def track_activity(user, trackable, action = params[:action], author = current_user)
  Activity.create! user: user, trackable: trackable, action: action, author: author
  PrivatePub.publish_to("/notifications", activity: activity)
end

def activity
  @activities = current_user.activities.includes(:author, :trackable).order(created_at: :desc) if signed_in?      
end

別のユーザーがコメントを書いたとき、または他のアクションを実行したときに、ユーザーに通知を生成します。

views/activities/_activity.html.erb にパーシャルがあります

<div class="activity activity_open" id="activity">
  <% @activities.each do |activity| %>
    <%= link_to activity.user.name, activity.user %>
    <%= render "activities/#{activity.trackable_type.underscore}/#{activity.action}", activity: activity %>
  <% end %>
</div>
<%= subscribe_to "/notificatons" %>

/layouts/_header.html.erb での呼び出し

<%= render @activities %>

そして今、他のユーザーがコメントを作成するときに、Private_pub gem new trac_activity を使用して publish_to("/notifications") が必要ですが、これを行う方法がわかりません

私はこれをする必要があります

<% publish_to "/notifications" do %>
  $("#activity").append("<%= j render(@activities) %>");
<% end %> 

アプリケーションコントローラーでアクションを実行し、remote: true のフォームがない場合、ファイルを保存する必要がある場所がわかりません。

4

1 に答える 1

0

あなたが達成しようとしているのは、おそらく一般的なアクティビティ データを/notificationsチャネルでリッスンしているユーザーにプッシュすることです。

あなたの方法は問題ありません(最初のもの):

PrivatePub.publish_to("/notifications", activity: activity)

ここで、ビューにハンドラーを記述する必要があります。何かのようなもの:

<%= subscribe_to "/notifications" %>

<script type="text/javascript">
  PrivatePub.subscribe("/notifications", function(data, channel) {
     alert(data.activity);
  });
</script>

subscribe javascript メソッド内で、必要なことは何でも行います。

<%=j render ...%>これは Ruby コードであり、javascript クライアント側メソッドにいるため、実際には別のものを呼び出すことはできません。したがって、ここには 2 つのオプションがあります。

  1. フラグメントをどこかでレンダリングし、_activity.html.erbそれを JavaScript 変数に入れ、PrivatePub 経由でコンテンツを置き換えます。

  2. フラグメントがそれほど複雑でない場合は、Javascript を使用して構築します。ただし、このレイアウトを 2 つの異なる点で維持する必要があります。

  3. Mustacheのようなものを使用します。それについては RailsCastを参照してください。

私はオプション 2 を選ぶと思いますが、それはパーシャルの複雑さに依存します。

faye がアクティブでソケットが開いていることを Browser Console で確認して、すべてが正常に機能していることを確認します PrivatePub.publish_to(...) rescue nil。faye サーバーがダウンしているという理由だけで例外が発生しないように、データがそれほど重要でない場合は使用することをお勧めします。

于 2014-10-09T12:07:42.653 に答える