如何创建一个简单的活动流?

问题描述:

我想实现一个简单的活动流。如何创建一个简单的活动流?

Given that User abc creates a post 123 
And User xyz comments on 123. 
Then user abc's activity stream should look something like: 
<ul> 
    <li>User <a href="https://*.com/users/abc">abc</a> created a post <a href="https://*.com/users/abc/posts/123">123</a></li> 
    <li>User <a href="https://*.com/users/xyz">xyz</a> commented on post <a href="https://*.com/users/abc/posts/123">123</a></li> 
</ul> 

我更喜欢填充活动模型(而不是控制器中的多个查询)。我添加了一个“after_create”钩到文章和评论模型既填充活动:

class Post < ActiveRecord 
    after_create do 
    ActivityCreate(:user_id => self.user_id, :description => "created a post") 
    end 
end 

我想保存我需要创建路线和链接,如POST_ID等特殊领域的,但我可能会有更多的活动,我想以后跟踪,喜欢,不喜欢,最喜欢等,我想要一个灵活的方式来创建活动描述。

所以我的问题是,什么是将link_to放入活动描述的有效方法?是否有任何C风格的printf方式列表助手以后评估?

排序的是这样的:

描述= [ “?用户评论交?”,user_path(User.find(self.user_id)),post_path(Post.find(self.id))]

然后在模板方面评估这个?

+0

模型知道任何关于链接和路由可能是一个坏主意。 –

+0

同意,也许活动可以更好地处理为多态关联... – Homan

这是我第一次关于你的情况。也许它启发你足够:)

class Activity < ActiveRecord::Base 
    #this might be a comment or a post or something else 
    belongs_to :changed_item, :polymorphic => true 
    #who did it? 
    belongs_to :user 
    #what did he do? 
    validates_presence_of :changes 

    def msg 
    #do fancy text generation 
    if changes.new_record 
     "#{user.name} created a #{changed_item.class}" 
    else 
     "#{user.name} changed #{changes.length} attributes of the #{changed_item.class} #{changed_item.title}" 
    end 
    end 

    def initialize(model, user) 
    #fetch changes and remember user and changed model 
    self.changed_item = model 
    self.user = user 
    self.changes << model.changed_attributes.merge({:new_record => model.new_record?}) 
    end 
end 

class Post < ActiveRecord::Base 
    after_save do 
    #remember who to be blamed 
    Activity.create(self, current_user) 
    end 
end 

class User < ActiveRecord::Base 
    #the users activities 
    has_many :activities 
end 
+0

只是好奇 - 在用户模型中,它应该是has_many':Activities'或has_many':活动'或轨道以某种方式知道区别? – dsignr

+1

你的意思是单数/复数?请参阅http://4loc.wordpress.com/2009/04/09/inflector-rails-pluralization/或http://edgeguides.rubyonrails.org/i18n.html#pluralization – abstraktor

+0

非常感谢! – dsignr