能否在不使用模型的情况下使用 CanCan 和控制器?

22

我正在使用CanCan进行授权。 我在/app/config/ability.rb中定义了模型-操作-用户规则,并且它运行良好。 我添加了load_and_authorize_resource到我的application_controller中,一切都完成了。

然而,我还有很多视图和控制器没有相关的模型。 例如,尝试加载统计页面时会出现错误:

NameError (uninitialized constant Statistic):
  activesupport (3.2.3) lib/active_support/inflector/methods.rb:229:in `block in constantize'
  activesupport (3.2.3) lib/active_support/inflector/methods.rb:228:in `each'
  activesupport (3.2.3) lib/active_support/inflector/methods.rb:228:in `constantize'
  ...

CanCan是否有一种方式可以与控制器和操作配合使用,而不是模型和操作?

4个回答

39

如果您正在使用load_and_authorize_resource方法,则无需提及class => false。cancan会默认检查并找到它。 - Madhan Ayyasamy
3
我不这么认为。 - Nithin
如果你没有告诉@MadhanAyyasamy的load_and_authorize_resource,那个控制器没有模型,它就会出问题。 - Leonardo Lourenço
1
谢谢您。在ability.rb中的文档中找不到提到将控制器作为单一符号进行传递的内容。 - kaydanzie
对我没有起作用。可能是因为我的控制器已经是单数形式(home)。 - stevec
命名空间控制器怎么样?例如:Users::SessionsController? - Blaine Lafreniere

5
您可以在ability.rb文件中指定控制器:

ability.rb:

can :read, StatisticsController # ability.rb

统计控制器:

class StatisticsController < ApplicationController

  def read
    authorize! :read, current_user 
  end
end

2

其他的答案对我都没用,但是下面这个有效:

can :read, :statistics # ability.rb

然后,在控制器中,您可以使用以下方法:
class StatisticsController < ApplicationController
  authorize_resource class: false
end

您可以使用 authorize! :<action>, :statistics 自动调用授权,也可以针对每个操作显式地执行:

class StatisticsController < ApplicationController
  def index
    authorize! :read, :statistics
  end
end

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接