だから私は、これが私たちが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