2014-10-09 65 views
1

我有行動,我的應用程序控制器application_controller.rb如何從PrivatePub接收更新時呈現Rails部分?

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 

它生成用戶通知當另一個用戶寫的評論或permorm其他動作。

我有我的部分在 的意見/活動/ _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( 「/通知」)與Private_pub創業板新trac_activity當其他用戶創建評論,但我不知道如何做到這一點

我需要做到這一點

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

,我不知道我在哪裏需要保存文件,如果我的應用控制器動作,它不具有與遠程的一種形式:真正

+0

你的代碼很奇怪。您正在以兩個不同的點發布/通知:視圖和方法track_activity中的控制器。你在使用哪一個? – coorasse 2014-10-09 12:02:46

+0

你爲什麼要在_activity內執行循環?它應該只渲染一個活動對象並不是很多 – coorasse 2014-10-09 14:31:29

回答

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> 

並且在訂閱javascript方法中,您將執行任何您想要的操作。

你不能真正調用另一個<%=j render ...%>因爲這是Ruby代碼,你在一個JavaScript客戶端的方法,讓您在這裏有兩種選擇:

  1. 渲染_activity.html.erb片段的地方,把它在JavaScript變量和更換內容,當談到通過PrivatePub

  2. 如果片段是不是真的複雜使用JavaScript來構建它:但你必須在兩個不同的點,保持編程和維持這種佈局

  3. 使用類似Mustache的東西。請參閱RailsCast about it

我想我會選擇2,但它取決於部分的複雜性。

檢查與瀏覽器控制檯王菲是積極和插座是開放的,以確保一切正常,我建議你使用 PrivatePub.publish_to(...) rescue nil如果數據不是很重要,所以你不會有一個例外,只是因爲faye服務器關閉。

+0

所有的作品,但是dosn't不這樣做$(「#activity」)。append(「<%= j render(@activities)%>」);因爲我不知道在哪裏添加這個腳本 – user3089327 2014-10-09 13:46:20

+0

你不能執行這段代碼。你必須使用JavaScript,如果你願意,像鬍鬚一樣來完成它。 只需使用Javascript構建相同的片段,也許將部分'_activity'放入一個JavaScript變量中。 – coorasse 2014-10-09 14:19:54