1

だから私は、これが私たちがSOに持っているような投票システムを作成するのにうまくいくと本当に思っていました:

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

  if @vote.value.nil?
    if params[:type] == "up"
      @vote.value = 1
    else
      @vote.value = -1
    end
  elsif (params[:type] == "up" && @vote.value == 1) || (params[:type] == "down" && @vote.value == -1)
    @vote.value = 0
  elsif ((params[:type] == "up" && @vote.value == -1) || (params[:type] == "down" && @vote.value == 1)) || (@vote.value == 0)
    if params[:type] == "up"
      @vote.value = 1
    else
      @vote.value = -1
    end
  end  

  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

この質問の最初の回答の例に従おうとしました:この Ruby on Rails コードが意図したとおりに機能しないのはなぜですか? ただし、私のコードでは、次のエラーのため、初めてビデオに投票できません。

TypeError (nil can't be coerced into Fixnum):
app/models/video_vote.rb:11:in `update_vote_sum'
app/controllers/video_votes_controller.rb:4:in `create

これが私のビデオ投票モデルです:

class VideoVote < ActiveRecord::Base
  belongs_to :user
  belongs_to :video
  validates_uniqueness_of :user_id, :scope => :video_id

  after_create :update_vote_sum

  private

    def update_vote_sum
      video.update_attributes!(:vote_sum => video.vote_sum + value)
    end
end

これが必要な場合に備えてvote_sum、ビデオ モデルからのメソッドを次に示します。

def vote_sum
  video_votes.sum(:value)
end
4

2 に答える 2

3

after_createメソッドではVideoVote.rb、nil値で作成したばかりの投票を含め、すべての投票を合計しています。に切り替えるafter_createafter_update、デフォルトをvalueonに設定しますVideoVote

それを見ると、とにかく毎回すべての投票をvote_sum呼び出している場合、投票にデフォルト値が設定されていれば、またはメソッドさえ必要ないでしょう。sumafter_createafter_update

-

このシステム全体をthumbs_upgemに置き換えて、面倒な作業を省くこともできます。

于 2011-03-19T17:42:47.767 に答える
0

ここで何をしようとしているのかわからない。vote_sum私が見る限り、ビデオの投票数を合計する方法ですが、なぜそれを属性として更新しようとしているのでしょうか? これは常にビデオの正しいスコアを返します。これは属性ではなく、メソッドの計算結果であるため、手動で更新する必要はありません。

于 2011-03-19T17:53:30.360 に答える