重构控制器,在哪里创建新方法



我一直在努力重构控制器,而我一直遇到的问题是我应该在哪里创建特定于控制器的方法?

例如,控制器中我的创建动作当前看起来像:

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中的一行,也可以有锅炉板代码等。无论如何,不要从字面上看。

回到您的问题:"将控制器代码放在哪里?"。如果是业务逻辑,则将其放入您的模型或单独的类中。如果您只想在逻辑上分开代码,那么我只会在控制器中创建一个私有方法并重构我的代码。如果代码的某些部分需要在几个控制器/类之间共享,那么我将创建一个单独的实用程序类。

最新更新