我一直在努力重构控制器,而我一直遇到的问题是我应该在哪里创建特定于控制器的方法?
例如,控制器中我的创建动作当前看起来像:
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规则,其中之一是:每种方法五行。除了创建一个全新的班级外,我最自然的本能是为该控制器的方法填充,这是将其放在Model 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。使用方法重构控制器的适当方法是什么?
首先,关于"每方法"规则的" 五行"。不要从字面上看。我猜这只是说" 保持控制器纤细(和模型平坦)"的另一种方式。最好在控制器方法而不是代码行中计算"职责",业务逻辑等。另外,您可以将几行代码放入Ruby中的一行,也可以有锅炉板代码等。无论如何,不要从字面上看。
回到您的问题:"将控制器代码放在哪里?"。如果是业务逻辑,则将其放入您的模型或单独的类中。如果您只想在逻辑上分开代码,那么我只会在控制器中创建一个私有方法并重构我的代码。如果代码的某些部分需要在几个控制器/类之间共享,那么我将创建一个单独的实用程序类。