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 %>

现在需要 publish_to("/notifications") 和 Private_pub gem new trac_activity 当其他用户创建评论但我不知道该怎么做

我需要这样做

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

如果我在应用程序控制器中的操作并且它没有带有远程的表单,我不知道我需要在哪里保存文件: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 客户端方法中,因此您有两个选择:

  1. 在某处渲染_activity.html.erb片段,将其放入 javascript 变量中,并在通过 PrivatePub 时替换内容

  2. 如果片段不是很复杂,请使用 Javascript 来构建它:但是您需要在两个不同的点上保持这个布局

  3. 使用类似Mustache的东西。请参阅有关它的 RailsCast

我想我会选择选项 2,但这取决于部分的复杂性。

使用浏览器控制台检查 faye 是否处于活动状态并且套接字已打开以确保一切正常, PrivatePub.publish_to(...) rescue nil如果数据不是很重要,我建议您使用,这样您就不会因为 faye 服务器关闭而出现异常。

于 2014-10-09T12:07:42.653 回答