我正在尝试实现一个简单的事件流。
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="/users/abc">abc</a> created a post <a href="/users/abc/posts/123">123</a></li>
<li>User <a href="/users/xyz">xyz</a> commented on post <a href="/users/abc/posts/123">123</a></li>
</ul>
我更喜欢填充事件模型(而不是 Controller 中的多个查询)。我在帖子和评论模型中添加了一个“after_create”钩子(Hook)来填充事件:
class Post < ActiveRecord
after_create do
ActivityCreate(:user_id => self.user_id, :description => "created a post")
end
end
我想存储创建路线和链接所需的特殊字段,例如 post_id 等,但我以后可能有更多想要跟踪的事件,喜欢、不喜欢、收藏夹等,我想要一种灵活的创建方式事件说明。
所以我的问题是,将 link_to 放入事件描述的有效方法是什么?是否有任何 c 风格的 printf 列出稍后要评估的助手的方式?
有点像这样:
description = [“用户?评论帖子?”,user_path(User.find(self.user_id)),post_path(Post.find(self.id))]
然后在模板方面评估这个?
最佳答案
这是我第一次联想到你的案子。也许它足够激励你:)
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
关于ruby-on-rails-3 - 如何创建一个简单的事件流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7718540/