0

只是一个非常简单的问题,我在 rails 的 lib 文件夹中有一个模块。

在该模块上,如果我们执行 Company.accessible_by(current_ability) 之类的操作,则会出现名称错误,其中 current_ability 未定义。

有人知道解决这个问题的方法吗?由于 current_ability 似乎只在控制器中识别。

4

1 回答 1

0

您需要将 current_ability 传入模块。与会话和参数数据(以及 current_user,如果您使用设计)一样,您无法访问您自己创建的这些内部模型或类。

这实际上是一件好事,因为您不希望您的业务对象依赖于 Web 堆栈。这些东西的一般方法(也适用于模型)是使用您传入的 current_ability 的引用来构造对象,或者在方法调用本身上构造对象。这是一些示例代码:

class Foo
  def initialize(ability)
     @current_ability = ability
  end

  def list_companies
    Company.accessible_by(@current_ability)
  end
end

或者,如果您只需要一次通话:

class Foo
  def list_companies(current_ability)
    Company.accessible_by(current_ability)
  end
end

这两种情况都完全有效,并且允许您使用 Mock 能力对象轻松测试代码。

于 2012-11-20T09:53:20.893 回答