我刚刚将cancan 1.5.0添加到我的rails 3 app这里是我的能力档案 -
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
我有一个自定义类(非restful函数)
class PagesController < ApplicationController
authorize_resource :class => false
def home
end
end
正如你所看到的,我正在使用正确的函数来进行一个不太安宁的课程,但我仍然收到这个错误 -
uninitialized constant Ability::Page
这是stacktrace的开始 -
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'
谢谢,Alex
答案 0 :(得分:8)
CanCan文档将can
方法描述为:
can
方法用于定义权限并需要两个参数。第一个是您正在设置权限的操作,第二个是您正在设置它的对象类。
因此,问题是您的系统中没有Page
类,CanCan可以管理对其的访问。
请注意,CanCan的构建如下:(我强调添加)
Ruby on Rails的授权库,它限制允许给定用户访问的资源。
因此,如果您的目标是控制没有附加rails资源的抽象概念,那么CanCan可能会遇到困难
答案 1 :(得分:6)
只是给现在发现这一点的人发了一封信......
您可以授权任何非宁静的控制器,抽象类和方法。
示例:
/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
所以请记住在非宁静/抽象控制器中使用skip_authorize_resource
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