link_to的多态行为

时间:2012-03-20 08:20:53

标签: ruby-on-rails ruby-on-rails-3 polymorphism

我在这里面临着一个棘手的挑战,也许你们中的一个可以帮助我。没什么太难的,我只是不知道要走的好方法。来了:

我有2个型号:

ActivityComment

我在这里使用MongoID和一个着名的宝石来处理投票(喜欢)。它只负责在ActivityComment内嵌入投票模型。

这意味着我没有Like模型。

我多么希望能够“喜欢”“活动”和/或“评论”。我的猜测是使用一个名为LikesController的控制器,使用两种方法来喜欢或不喜欢一个项目。

然后我会有这样的路线:

resources :activities,  :only => [] do
  resources :comments,  :only => [:create, :destroy]
  resources :likes,     :only => [:create, :destroy]
end

resources :comments, :only => [] do
  resources :likes,  :only => [:create, :destroy]
end

以下是来自bundle exec rake routes的指定路线:

activity_comments POST   /activities/:activity_id/comments(.:format)     comments#create
activity_comment  DELETE /activities/:activity_id/comments/:id(.:format) comments#destroy
activity_likes    POST   /activities/:activity_id/likes(.:format)        likes#create
activity_like     DELETE /activities/:activity_id/likes/:id(.:format)    likes#destroy
comment_likes     POST   /comments/:comment_id/likes(.:format)           likes#create
comment_like      DELETE /comments/:comment_id/likes/:id(.:format)       likes#destroy

现在我希望在某个视图页面中指向相应操作的LikesController的“赞”/“不同”链接(create => like; destroy =>不同)。

唯一的问题是我不知道如何用良好的路径创建link_to。 以下是我到目前为止的情况:

link_to 'Like', eval("#{item.class.name.downcase}_likes_path(item)"), :method => 'post'

link_to 'Unlike, eval("#{item.class.name.downcase}_likes_path(item)"), :method => 'destroy'

任何人都可以给我一个如何以更清洁的方式做到这一点的提示吗?

以下是我的模特:

class Activity
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongo::Voteable

  has_many    :comments,  :as => :item
  belongs_to  :subject,   :polymorphic => true
  embeds_one  :user

  validates :user, :presence => true

  voteable self, :up => +1, :down => -1
end

class Comment
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongo::Voteable

  belongs_to :item, :polymorphic => true
  embeds_one :user

  field :text, :type => String, :default => nil

  validates :text, :presence => true
  validates :user, :presence => true

  attr_accessible :text, :user

  voteable self, :up => +1, :down => -1
end

你必须记住,很多未来物品也可能“可爱”,这就是为什么我选择使用LikesController旁边每个物品的控制器内都有重复的方法来处理“喜欢”和“ unlikes”。也许我错了?

谢谢。

1 个答案:

答案 0 :(得分:2)

我会在这里找一个助手。

def likehelper(likable)
  if likable.is_a? Activity
    # return activitycommentpath..
  ...
end

然后在您的视图中link_to 'Like', likehelper(item),同样适用于Unlike。如果其他对象变得“可爱”,那么您只需向助手添加新的“规则”。