Почему этот код Ruby on Rails не работает так, как я намереваюсь? - PullRequest
0 голосов
/ 19 марта 2011

Итак, я попытался построить то, о чем спрашивал в этом вопросе: Исправить механизм голосования

Однако это решение не работает. Пользователь по-прежнему может голосовать сколько угодно раз. Как я могу исправить это и / или рефакторинг?

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

1 Ответ

3 голосов
/ 19 марта 2011

@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
...