在方法的before_filter隐藏的实例变量(Hidden instance variables

2019-10-17 14:49发布

它是隐藏在私有方法的实例变量初始化一个好的做法呢?

例如,我有一些动作的用户控制:

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

有人说,它看起来像一个神奇的,但它是干的。 你怎么看?

Answer 1:

他们不是隐藏的,他们是对的。

就个人而言,当涉及到干的,还有我喜欢遵循规则(我读它的地方,但我不记得在哪里,见谅) - 要复制的内容是第一次,你将它复制并皱着眉头贴,但如果你想再次复制它,这是当你提取出来到一个地方。

:load_user例子是好的,但我不会费心:set_user



Answer 2:

这对我来说太干。

before_filter像实例变量初始化程序的东西使我疯了,因为该方法显示为空白,但东西正在发生。 不是一个大问题,如果该方法,否则空的,但大的方法可能会掩盖过滤器,或者你可能完全忽略它。 然后,您必须追捕过滤方法和精神上重建工作流程。 这使得维护比它需要更加困难。

我想放弃的过滤器,并呼吁在地方getter / setter方法:

def show
  get_user
end  

这样,你可以看到初始化发生。 如果你坚持使用过滤器,把一个注释的方法建议正在应用的过滤器。

就个人而言,我保留before_filter仅供条件逻辑。



文章来源: Hidden instance variables in before_filter method