我一直在努力重构我的控制器,而我一直在遇到的问题是我应该在哪里创建控制器特定的方法?
例如,我在控制器中的创建操作目前看起来像:
scores_controller.rb
def create
@score = @user.scores.new(score_params)
if @score.save
set_shuffled_questions(@score, params[:score][:selected])
questions = Score.build_quiz(@score, params[:score][:selected])
question = questions.shuffle.first
cookies[:question] = question.question
flash[:success] = "Begin quiz, good luck!"
redirect_to score_quiz_path(@score, question)
else
flash[:alert] = "You suck"
render 'new'
end
end
我开始努力使用Sandi Metz' rules for developers,其中一个是:每个方法五行。除了创建一个充满了这个控制器方法的全新类之外,我最自然的本能是将它放在模型Score.rb
中。如果是这种情况,我可以将方法更改为:
score.rb
# Creates quiz with shuffled questions.
def set_shuffled_questions(selected)
questions = Score.build_quiz(self, selected)
question = questions.shuffle.first
cookies[:question] = question.question
flash[:success] = "Begin quiz, good luck!"
redirect_to score_quiz_path(self, question)
end
scores_controller.rb
def create
@score = @user.scores.new(score_params)
if @score.save
@score.set_shuffled_questions(params[:score][:selected])
else
flash[:alert] = "You suck"
render 'new'
end
end
我很确定这不是正确的方法,因为你无法从模型中设置持久性cookie。使用方法重构控制器的适当方法是什么?
答案 0 :(得分:0)
首先,关于“每行五行”规则。不要从字面上理解。我想这只是另一种说法“让你的控制器保持苗条(模型平坦)”。最好在控制器方法中计算“职责”,业务逻辑等,而不是代码行。另外,你可以在Ruby中将几行代码放在一行中,或者可以有一个样板代码等等。不管怎么说,不要从字面上理解它。
回到你的问题:“在哪里放置控制器代码?”。如果它是业务逻辑,则将其放入模型或单独的类中。如果你只是想在逻辑上分离你的代码,那么我只需在我的控制器中创建一个私有方法并重构我的代码。如果代码的某些部分需要在多个控制器/类之间共享,那么我将创建一个单独的实用程序类。