0

我有rails_best_practices宝石,我收到以下警告:

APP/app/controllers/users_controller.rb - use model association (for @user_answer)

参考此代码要点:

begin
  @user_answer = @user.user_answers.where(:question_id => @question_id).first
  if @user_answer
    @user_answer.answer_id = @answer_id
    @user_answer.save!
    @message = 'Answer updated successfully!'
  else
    @user.user_answers.create(:question_id => params[:questionId], :answer_id => params[:answerId])
    @message = 'Answer submitted successfully!'
  end
rescue ex
  @message = ex.message.split(':')[1].chomp
end

但是根据关于模型关联的页面,它看起来并没有违反这一点,看起来它正在正确地遵循。我错过了什么吗?

4

1 回答 1

1

问题在于直接访问@user_answer对象中的变量,而不是更新变量user_answer中的@user变量……而且由于 Rails 有一个update方法,我们可以这样做:

begin
  @user_answer = @user.user_answers.where(:question_id => @question_id).first
  if @user_answer
    @user.user_answers.update(:question_id => @question_id, :answer_id => @answer_id)
    @message = 'Answer updated successfully!'
  else
    @user.user_answers.create(:question_id => @question_id, :answer_id => @answer_id)
    @message = 'Answer submitted successfully!'
  end
rescue ex
  @message = ex.message.split(':')[1].chomp
end

但我们可以做得更好。与创建和更新不同,我们可以简单地使用 Ruby 的短路评估来创建一个`@user_answer 符号并更新它是否是新的。

begin
  @user_answer = @user.user_answers.where(:question_id => @question_id).first || @user.user_answers.new
  @user_answer.update_attributes!(question_id: @question_id, answer_id: @answer_id)
  @message = 'Answer submitted successfully!'
rescue ex
  @message = ex.message.split(':')[1].chomp
end
于 2013-07-14T19:08:09.123 回答