2016-06-19 64 views
0

我一直在重構我的控制器,我一直在努力的問題是應該在哪裏創建控制器特定的方法?重構控制器,在哪裏創建新的方法?

例如,我創建一個控制器內的行動將目前的樣子:

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

首先,關於「五行每種方法」的規則。不要從字面上理解。我想這只是另一種說法「保持你的控制器纖細(和模型平坦)」。最好在你的控制器方法中計算「職責」,業務邏輯等,而不是代碼行。另外,你可以在Ruby中將多行代碼放到一行中,或者可以有一個鍋爐代碼等。不管怎樣,不要從字面上理解。

回到你的問題:「把控制器代碼放在哪裏?」。如果它是一個業務邏輯,那麼把它放到你的模型或單獨的類中。如果你只是想在邏輯上分離你的代碼,那麼我只需在我的控制器中創建一個私有方法並重構我的代碼。如果代碼的某些部分需要在幾個控制器/類之間共享,那麼我將創建一個單獨的實用程序類。

相關問題