Ruby on rails 设置公共实例变量(Ruby On Rails)的前过滤器

Ruby on rails 设置公共实例变量(Ruby On Rails)的前过滤器,ruby-on-rails,Ruby On Rails,这样做是否是一种常见的做法: before_filter :get_clients, :only => [:new, :edit, :create, :update] ... def get_clients @clients = Client.accessible_by(current_ability) end 我的表单需要访问@clients,所以我用before过滤器设置变量@clients,而不是在每个方法中都这样做。这有意义吗?我建议改为构建一个记忆帮助器: def

这样做是否是一种常见的做法:

before_filter :get_clients, :only => [:new, :edit, :create, :update]
...
def get_clients
      @clients = Client.accessible_by(current_ability)
end

我的表单需要访问@clients,所以我用before过滤器设置变量@clients,而不是在每个方法中都这样做。这有意义吗?

我建议改为构建一个记忆帮助器:

def current_clients
  @current_clients ||= Client.accessible_by(current_ability)
end
helper :current_clients

这与before过滤器一样有效,但除非您需要实际加载表单/视图的客户机列表,否则不会运行。您正在延迟加载此资源。知道如何加载客户端列表的责任仍然由控制器承担。

即使显然不安静,它也是普通、干燥和干净的。只是尝试了这个建议,问题是当前的功能似乎只能从控制器获得。我正在使用cancanThe我粘贴的代码块应该在控制器中。您无法访问您的can助手吗?出于好奇,这种包含助手的方法在测试中是否有任何作用?我在app controller中有一个类似的授权方法,在我所有的控制器中使用before过滤器调用该方法。测试时,我会将其注释掉,这样我的测试代码就可以在代码中运行,而无需重定向到登录屏幕。@Rick-您最好删除已登录的用户,而不是注释掉要测试的代码。例如,如果您有一个current_user方法,可以从会话中查找经过身份验证的用户,您可以将其存根到您的测试用户。@Rick-但是,是的,当您隔离系统的某些部分时,这样做的函数/帮助程序可以更容易地测试和存根值。