1

개인 메서드에서 인스턴스 변수 초기화를 숨기는 것이 좋습니다.before_filter 메서드의 숨겨진 인스턴스 변수

예를 들어, 내가 어떤 행동을 가진 사용자 컨트롤러가 있습니다

class UsersController < ApplicationController 
    before_filter :get_user, only: [:show, :edit, :update, :destroy] 
    before_filter :set_user, only: [:new, :create] 

    def index 
    @users = User.all 
    end 

    def show 
    end 

    def new 
    end 

    def edit 
    end 

    def create 
    if @user.save 
     redirect_to @user, notice: 'User was successfully created.' 
    else 
     render action: 'new' 
    end 
    end 

    def update 
    if @user.update_attributes(params[:user]) 
     redirect_to @user, notice: 'User was successfully updated.' 
    else 
     render action: 'edit' 
    end 
    end 

    def destroy 
    @user.destroy 
    redirect_to users_path 
    end 

private 

    def get_user 
    @user = User.find(params[:id]) 
    end 

    def set_user 
    @user = User.new(params[:user]) 
    end 
end 

어떤 사람들은 마술처럼 보인다 말을하지만, DRY입니다. 어떻게 생각해?

답변

0

숨겨진 것이 아니며 바로 거기에 있습니다.

개인적으로 DRY와 관련하여 내가 따라야 할 규칙이 있습니다 (어딘가에 읽었지 만 어디에서 용서하든 기억하지 못합니다). 처음으로 콘텐츠를 복사하고 복사하여 붙여 넣으십시오 찌푸린 얼굴로, 그러나 당신이 그것을 다시 복제하기를 원한다면, 그것은 그것을 한 곳으로 추출 할 때입니다.

귀하의 :load_user 예는 괜찮지 만, :set_user으로 귀찮게하지 않을 것입니다.

0

이것은 나에게 너무 건조합니다.

before_filter 인스턴스 변수 초기화와 같은 일상적인 작업의 경우 메소드가 공백으로 표시되기 때문에 미친 듯이 보이지만 아직 처리가 진행 중입니다. 메서드가 비어 있으면 큰 문제는 아니지만 큰 메서드는 필터를 가릴 수 있습니다. 또는 필터를 모두 간과 할 수 있습니다. 그런 다음 필터 방법을 검색하고 워크 플로를 정신적으로 재구성해야합니다. 그것은 유지 보수가 필요 이상으로 어렵게 만듭니다.

나는 필터를 포기하고 대신에 게터/세터 메소드를 호출 할 것이다 :

def show 
    get_user 
end 

초기화가 일어나는 위치를 볼 수있는 방법을. 필터 사용을 주장하는 경우 필터 적용 방법을 설명하는 주석을 넣으십시오.

개인적으로 개인적으로 조건부 논리에만 before_filter을 예약합니다.

관련 문제