重构Controller,在哪里创建新方法?

时间:2016-06-19 05:26:49

标签: ruby-on-rails

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

例如,我在控制器中的创建操作目前看起来像:

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。使用方法重构控制器的适当方法是什么?

1 个答案:

答案 0 :(得分:0)

首先,关于“每行五行”规则。不要从字面上理解。我想这只是另一种说法“让你的控制器保持苗条(模型平坦)”。最好在控制器方法中计算“职责”,业务逻辑等,而不是代码行。另外,你可以在Ruby中将几行代码放在一行中,或者可以有一个样板代码等等。不管怎么说,不要从字面上理解它。

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