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

Они не скрыты, они прямо там.

Лично, когда дело доходит до СУХОЙ, есть правило, которое мне нравится следовать (я читаю его где-то, но я не помню, где, простите меня) - в первый раз, когда вы хотите дублировать контент, вы копируете и вставляете его с хмурым взглядом, но если вы хотите повторить его снова, вот когда вы его извлечете в одно место.

Ваш :load_user пример в порядке, но я бы не стал беспокоиться о :set_user.

0

Это слишком DRY для меня.

before_filter для обычных вещей, таких как инициализация переменных экземпляра, приводит меня в бешенство, потому что метод выглядит пустым, но все происходит. Неважно, если метод в противном случае пуст, но большие методы могут скрыть фильтр, или вы можете полностью его игнорировать. Затем вам нужно выследить метод фильтрации и мысленно восстановить рабочий процесс. Это делает техническое обслуживание более сложным, чем нужно.

Я бы отказаться от фильтров и вызывать методы геттер/сеттер на месте:

def show 
    get_user 
end 

Таким образом, вы можете увидеть, где инициализация происходит. Если вы настаиваете на использовании фильтров, поставьте комментарий в методе, в котором говорится, что применяются фильтры.

Лично я резервирую before_filter только для условной логики.