我在应用程序控制器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客户端方法,所以这里有两个选项:
在某个地方渲染
_activity.html.erb
片段,将其放入javascript变量中,并在其通过PrivatePub 时替换内容如果片段不是很复杂,请使用Javascript来构建它:但您需要在两个不同的点上保持这种布局
使用类似Mustache的东西。查看RailsCast。
我想我会选择选项2,但这取决于部分的复杂性。
使用浏览器控制台检查faye是否处于活动状态,套接字是否打开,以确保一切正常,我建议您使用PrivatePub.publish_to(...) rescue nil
,如果数据不是真正重要的,那么您不会因为faye服务器关闭而出现异常。