如何在从PrivatePub接收更新时呈现Rails部分



我在应用程序控制器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发布_ to("/nootifications"),但我不知道这个是怎么做的

我需要做这个

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

如果我在应用程序控制器中的操作没有带有remote:true 的表单,我不知道我需要在哪里保存文件

您试图实现的可能是将通用活动数据推送给在/notifications通道上侦听的用户。

你的方法很好(第一种):

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

现在您需要在视图中为它编写一个处理程序。类似于:

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

在subscribejavascript方法中,您可以随心所欲。

实际上,您不能调用另一个<%=j render ...%>,因为这是Ruby代码,并且您使用的是javascript客户端方法,所以这里有两个选项:

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

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

  3. 使用类似Mustache的东西。查看RailsCast。

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

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

最新更新