2013-07-14 83 views
0

我有rails_best_practices宝石和我得到以下警告:Ruby on Rails的使用模特协会

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 

但根据page on model association它看起来不像是违反了这一点,它看起来像是正确的。我是否错过了这件事?

+0

哪一行是第33行?我认为这是抱怨“@ user_answer.answer_id = @answer_id”,它看起来像在你分享的链接中解释的气味类似 –

+0

哎呦我删除了指向代码所在的方法的行号(所以行号实际上并没有帮助解决这个问题) – acconrad

回答

1

问题在于直接访问变量在@user_answer对象,并且@user变量中不更新user_answer ...既然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