4

我刚刚将 cancan 1.5.0 添加到我的 rails 3 应用程序中,这是我的能力文件 -

def initialize(user)
 user ||= User.new

if user.role == 'Admin'
  can :manage, :all
end
if user.role == 'Standard'
  can :manage, Library
  can :manage, Page
else
  can :manage, Page
  can :manage, Library
end

我有一个自定义类(非休息功能)

class PagesController < ApplicationController
 authorize_resource :class => false

 def home
 end
end

如您所见,我正在为一个不平静的课程使用正确的功能,但我仍然收到此错误 -

uninitialized constant Ability::Page

这是堆栈跟踪的开头 -

app/models/ability.rb:16:in `initialize'
cancan (1.5.0) lib/cancan/controller_additions.rb:327:in `new'
cancan (1.5.0) lib/cancan/controller_additions.rb:327:in `current_ability'
cancan (1.5.0) lib/cancan/controller_additions.rb:308:in `authorize!'
cancan (1.5.0) lib/cancan/controller_resource.rb:40:in `authorize_resource'
cancan (1.5.0) lib/cancan/controller_resource.rb:9:in `block in add_before_filter'
activesupport (3.0.3) lib/active_support/callbacks.rb:436:in `   _run__1386450187816505438__process_action__15559788756486462__callbacks'
activesupport (3.0.3) lib/active_support/callbacks.rb:409:in `_run_process_action_callbacks'
activesupport (3.0.3) lib/active_support/callbacks.rb:93:in `run_callbacks'

谢谢,亚历克斯

4

2 回答 2

8

CanCan 文档将该can方法描述为:

can方法用于定义权限,需要两个参数。第一个是您为其设置权限的操作,第二个是您为其设置权限的对象类别。

所以,问题是你的系统中没有一个Page类供 CanCan 管理访问。

请注意,CanCan 构建为:(强调由我添加)

Ruby on Rails 的授权库,它限制允许给定用户访问的资源。

因此,如果您的目标是控制没有附加 Rails 资源的抽象概念,那么您可能会很难使用 CanCan

于 2011-01-12T16:43:53.287 回答
6

只是给现在发现此内容的任何人的便条...

您可以授权任何非 RESTful 控制器、抽象类和方法。

例子:

/app/models/role_ability.rb

class RoleAbility
   def initialize(user)
     user ||= User.new

     if user.role == 'Admin'
      can :manage, Post      # some existing resource_authorisation
      can :do_this, :on_this # authorizing a non resource    
     end
   end
end

:do_this 和 :on_this 完全是任意的,但它们必须与授权匹配!控制器中的参数就像这样......

class Controller < ApplicationController
   def some_abstract_method
      ### Awesome method code goes here

      authorize! :do_this, :on_this
   end
end

请记住,您可能已经在 ApplicationController 中进行了一些资源授权,可能像这样

class ApplicationController 
   authorize_resource || authorize! :admin, Object || load_and_authorize_resource etc
end

所以记得在你的非休息/抽象控制器中跳过授权资源

class AbstractController < ApplicationController

   skip_authorize_resource

   def some_abstract_method
      authorize! :do_this, :on_this
   end
end

现在管理员可以 :do_this, :on_this 并且会很好地授权。您可能想要更语义化地命名该功能,只是想强调任意性。

这都是使用 Cancan 1.5,之前没有尝试过任何东西。

来自https://github.com/ryanb/cancan/wiki/Non-RESTful-Controllers

于 2012-04-03T05:59:28.210 回答