2011-03-19 51 views
0

所以我试图建立我在这个问题上所问:Fix voting mechanism为什么这个Ruby on Rails代码不能像我打算的那样工作?

但是,此解决方案不起作用。用户仍然可以多次投票他或她想要的。我如何解决这个问题和/或重构?

def create  
    @video = Video.find(params[:video_id]) 
    @vote = @video.video_votes.new 
    @vote.user = current_user 

    if params[:type] == "up" 
     @vote.value = 1 
    else 
     @vote.value = -1 
    end 

    if @previous_vote.nil? 
    if @vote.save 
     respond_to do |format| 
     format.html { redirect_to @video } 
     format.js 
     end 
    else 
     respond_to do |format| 
     format.html { redirect_to @video } 
     format.js {render 'fail_create.js.erb'} 
     end 
    end 
    elsif @previous_vote.value == params[:type] 
    @previous_vote.destroy 
    else 
    @previous_vote.destroy  
    if @vote.save 
     respond_to do |format| 
     format.html { redirect_to @video } 
     format.js 
     end 
    else 
     respond_to do |format| 
     format.html { redirect_to @video } 
     format.js {render 'fail_create.js.erb'} 
     end 
    end 
    end 
    @previous_vote = VideoVote.where(:video_id => params[:video_id], :user_id => current_user.id).first 
end 

回答

3

@previous_vote@previous_vote在每次请求开始时似乎都是零?

我会亲自去掉控制器中的所有逻辑,并将唯一性限制放在它们所属的模型或数据库级别。

更新

这可能是充满了错误,但把它当作伪代码

模式是这样的:

class Video < ActiveRecord::Base 
    has_many :votes 
end 

class Vote < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :video 
    validates_uniqueness_of :user_id, :scope => :video_id # only one vote per person per video 
end 

class User < ActiveRecord::Base 
    has_many :votes 
end 

控制器:

def create 
    @video = Video.find(params[:video_id]) 
    @vote = current_user.votes.find_or_create_by_video_id(@video.id) 

    # change this next block of code so you assign value to the vote based on whatever logic you need 
    if you_need_to_do_anything_to_change_its_value 
    @vote.value = :whatever 
    end 

    if @vote.save 
    redirect_to @video 
    else 
    render :whatever_is_appropriate 
    end 
end 
+0

什么该理由是零?为什么将它移到模型中?代码如何看待模型? – 2011-03-19 08:26:58

+0

我已经更新了我的原始答案。 – lebreeze 2011-03-19 08:35:57

+0

如果投票未通过验证,它是否会默默失败?另外,何时验证运行?当我尝试将投票保存到数据库中时? – 2011-03-19 08:44:36

相关问题