#ruby-on-rails-3 #model #render #helper
#ruby-on-rails-3 #Модель #визуализация #помощник
Вопрос:
Я пытаюсь реализовать простой поток действий.
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>
Я предпочитаю заполнять модель действий (а не несколько запросов в контроллере). Я добавил хук ‘after_create’ к моделям сообщений и комментариев для заполнения действия:
class Post < ActiveRecord
after_create do
ActivityCreate(:user_id => self.user_id, :description => "created a post")
end
end
Я думал о сохранении специальных полей, которые мне понадобятся для создания маршрутов и ссылок, таких как post_id и т. Д., Но у меня может быть больше действий, которые я захочу отслеживать позже, лайки, антипатии, избранное и т. Д., И мне нужен гибкий способ создания описаний действий.
Итак, мой вопрос в том, каков эффективный способ поместить link_to в описание действия? Существует ли какой-либо способ printf в стиле c для перечисления помощников, которые будут оценены позже?
Что-то вроде этого:
описание = [«Пользователь? прокомментировал сообщение?», user_path(User.find(self.user_id)), post_path(Post.find(self.id ))]
А затем оценить это на стороне шаблона?
Комментарии:
1. Вероятно, это плохая идея, чтобы модель знала что-либо о ссылках и маршрутах.
2. согласен, возможно, активность лучше обрабатывать как полиморфную ассоциацию…
Ответ №1:
Это моя первая ассоциация по поводу вашего случая. Возможно, это вас достаточно вдохновляет
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
Комментарии:
1. Просто любопытно — в пользовательской модели это должно быть has_many ‘:Activities’ или has_many ‘: Activitys’ или rails каким-то образом понимает разницу?
2. вы имеете в виду единственное / множественное число? смотрите 4loc.wordpress.com/2009/04/09/inflector-rails-pluralization или edgeguides.rubyonrails.org/i18n.html#pluralization