2012-02-09 52 views
1

我有三个型号:has_many票为votable),评论has_many票为votable)和投票belongs_to可投票)。在控制器中获取类型与多态关联的元素(Rails)?

这是votes_controller.rb:

class VotesController < ApplicationController 
    def vote_up 
    @votable = WHAT_TO_PLACE_HERE?.find(params[:id]) 

    if @votable.votes.exists?(:user_id => current_user.id) 
     @notice = 'You already voted' 
    else 
     @vote = @post.votes.create(:user_id => current_user.id, :polarity => 1) 
     @votable.reload 
    end 

    respond_to do |format| 
     format.js 
    end 
    end 

相关模式:

create_table "comments", :force => true do |t| 
    t.text  "content" 
    t.integer "post_id" 
    t.integer "user_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "total_votes", :default => 0 
    end 

    add_index "comments", ["post_id", "user_id"], :name => "index_comments_on_micropost_id_and_user_id" 

    create_table "posts", :force => true do |t| 
    t.string "content" 
    t.integer "user_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "title" 
    t.integer "comments_count", :default => 0, :null => false 
    t.integer "total_votes", :default => 0 
    end 

    create_table "votes", :force => true do |t| 
    t.integer "votable_id" 
    t.string "votable_type" 
    t.integer "user_id" 
    t.integer "polarity" 
    t.integer "total" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

我需要的方式找到可投票元素的类型(评论)等等我可以将它分配给@votable。任何建议来完成这个?

编辑:

视图/帖/ show.html.erb:

<%= link_to "Vote Up", vote_up_path(@post), :remote => true, :class => "vote-up" %><br /> 

routes.rb中:

get 'votes/:id/vote_up' => 'votes#vote_up', as: 'vote_up' 

回答

1

假设类型经由传递params,你可以这样做:

params[:votable_type].constantize.find(params[:id]) 

请检查文档constantize

您可以通过追加它作为参数传递给vote_up_path发送类型:

<%= link_to "Vote Up", vote_up_path(@post, :votable_type => 'Post'), :remote => true, :class => "vote-up" %> 

喜欢这个将作为一个GET参数,这不应该是一个问题。如果你不喜欢这样,你必须改变你的路线,并在某处添加:votable_type

+0

谢谢!其中一个问题是:'type'是指'votes'表中的':votable_type'列(如上所示)? – alexchenco 2012-02-09 09:11:58

+0

是的,它指的是':votable_type'。对不起,如果我使用'params [:votable_type]'而不是'params [:type]'',我的答案会更清晰。 – Mischa 2012-02-09 09:15:39

+0

嘿,我刚刚意识到在投票创建之前没有'votable_type'(并且代码在这里提供的代码之后)。这就是为什么它不适合我。有没有解决方案? – alexchenco 2012-02-09 09:26:12