2012-03-20 10 views
0

私はここで厄介な挑戦に直面しています。あまりにも難しいことはありません、私はちょうどいい道のりを知りません。ここに来る:私は票(同類)を処理するために有名な宝石とここMongoIDを使用していlink_toを使った多態的な振る舞い

ActivityComment

:私は2つのモデルを持っている

。投票モデルをActivityまたはCommentに埋め込むだけです。

これは私がLikeモデルを持っていないことを意味します。

「アクティビティ」および/または「コメント」を「好き」にすることができることを、どのようにしたいと思いますか。私の推測では、LikesControllerという名前のコントローラを1つ使用して、アイテムを好き嫌いする方法が2つあります。ここで

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 

は今、私は「のように」/「とは異なり、」リンクを持っていると思い

私はその後、ルートのこの種を持っているでしょういくつかのビューページでは、対応するアクション(create => like; destroy => unlike)のLikesControllerを指しています。

唯一のことは、良いパスで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 

あなたはFUTURオブジェクトの多くは、私はそれぞれの内部で重複メソッドを持つ横にLikesControllerに行くことを選択した理由です、また、「好感の持てる」ことができることを心に留めておく必要がありアイテムのコントローラは「好き」と「軽い」を処理します。たぶん私は間違っています ?

ありがとうございます。

答えて

2

ここでビューヘルパーを使用します。あなたのビューlink_to 'Like', likehelper(item)、およびUnlikeのための同じで

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

してから。他のオブジェクトが「好き」になる場合は、ヘルパーに新しい「ルール」を追加するだけです。

+0

はい、私はこのアイデアも持っていましたが、入れ子にされたIF ELSE条件は好きではありません^^しかし、おそらく選択肢がありません><。私は他の人たちも同様に答えるのを待つつもりだ。 –