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 

有人說,它看起來像一個神奇的,但它是乾的。你怎麼看?

回答

0

他們沒有隱藏,他們就在那裏。個人而言,當談到DRY時,我喜歡遵循一個規則(我在某處讀過它,但我不記得在哪裏,請原諒我) - 第一次您想複製內容時,您複製並粘貼它皺着眉頭,但如果你想再次複製它,那就是當你將它解壓到一個地方。

你的:load_user例子很好,但我不打擾:set_user

0

這對我來說太乾了。

before_filter對於常規的東西,如實例變量初始化驅使我瘋了,因爲該方法顯示爲空白,但事情正在發生。如果該方法是空的,那麼這並不是什麼大問題,但是大的方法可能會掩蓋過濾器,或者您可能完全忽略它。然後你必須尋找過濾方法,並在精神上重建工作流程。它使維護比需要的更加困難。

我會放棄過濾器和調用getter/setter方法代替:

def show 
    get_user 
end 

這樣,你可以看到初始化發生。如果您堅持使用過濾器,請在該方法中留言,建議正在應用過濾器。

個人而言,我僅爲條件邏輯保留before_filter