как создать простой поток действий?

#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