Полиморфное поведение с link_to - PullRequest
0 голосов
/ 20 марта 2012

Здесь я сталкиваюсь с довольно сложной задачей, может быть, кто-то из вас может помочь мне в этом.Ничего особенного, я просто не знаю, как идти.Вот:

У меня есть 2 модели:

Activity и Comment

Я использую MongoID здесь со знаменитым камнем для обработки голосов (лайков).Это только заботится о встраивании модели голосования в Activity или Comment.

Это означает, что у меня нет модели 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 =>как; уничтожить => в отличие от).

Единственное, что я не знаю, как создать 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 помимодубликат метода внутри контроллера каждого элемента для обработки «нравится» и «не нравится».Может я не прав?

Спасибо.

1 Ответ

2 голосов
/ 20 марта 2012

Я бы пошел с помощником вида здесь.

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

, а затем в вашем представлении link_to 'Like', likehelper(item), и то же самое для Unlike.Если другие объекты станут «симпатичными», все, что вам нужно будет сделать, это добавить новое «правило» к вашему помощнику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...