只是一个非常简单的问题,我在 rails 的 lib 文件夹中有一个模块。
在该模块上,如果我们执行 Company.accessible_by(current_ability) 之类的操作,则会出现名称错误,其中 current_ability 未定义。
有人知道解决这个问题的方法吗?由于 current_ability 似乎只在控制器中识别。
只是一个非常简单的问题,我在 rails 的 lib 文件夹中有一个模块。
在该模块上,如果我们执行 Company.accessible_by(current_ability) 之类的操作,则会出现名称错误,其中 current_ability 未定义。
有人知道解决这个问题的方法吗?由于 current_ability 似乎只在控制器中识别。
您需要将 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 能力对象轻松测试代码。