在私有方法中隐藏实例变量初始化是一个好习惯吗?
例如,我有一个用户控制器,其中包含一些操作:
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 :(得分:0)
他们没有被隐藏,他们就在那里。
就个人而言,当涉及到DRY时,我会遵循一条规则(我在某处阅读但我不记得在哪里,请原谅我) - 第一次要复制内容时,复制并粘贴它皱眉,但是如果你想再次复制它,那就是当你将它提取到一个地方时。
您的:load_user
示例没问题,但我不会打扰:set_user
。
答案 1 :(得分:0)
这对我来说太干了。
before_filter
对于像实例变量初始化这样的常规操作会让我疯狂,因为该方法显示为空白,但事情正在发生。如果方法是空的,那么没什么大不了的,但是大的方法可能会使过滤器模糊不清,或者你可能会完全忽略它。然后,您必须搜索过滤器方法并在心理上重建工作流程。它使维护更加困难。
我会放弃过滤器并调用getter / setter方法:
def show
get_user
end
通过这种方式,您可以看到初始化发生的位置。如果您坚持使用过滤器,请在方法中添加注释,告知过滤器正在应用。
就个人而言,我仅为条件逻辑保留before_filter
。