Rails3 - CanCan - 未初始化的常量Ability :: Page

Ale*_*lex 4 ruby-on-rails cancan ruby-on-rails-3

我刚刚将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
Run Code Online (Sandbox Code Playgroud)

我有一个自定义类(非restful函数)

class PagesController < ApplicationController
 authorize_resource :class => false

 def home
 end
end
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我正在使用正确的函数来安排一个不太安宁的类,但我仍然遇到这个错误 -

uninitialized constant Ability::Page
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪的开始 -

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'
Run Code Online (Sandbox Code Playgroud)

谢谢,亚历克斯

Gar*_*eth 8

CanCan文档将can方法描述为:

can方法用于定义权限并需要两个参数.第一个是您正在设置权限的操作,第二个是您正在设置它的对象类.

因此,问题是Page您的系统中没有CanCan用于管理访问权限的类.

请注意,CanCan的构建如下:(重点由我添加)

授权库,Ruby on Rails的制约哪些资源给定用户被允许访问.

因此,如果您的目标是控制没有附加rails资源的抽象概念,那么CanCan可能会遇到困难


小智 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
Run Code Online (Sandbox Code Playgroud)

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

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

      authorize! :do_this, :on_this
   end
end
Run Code Online (Sandbox Code Playgroud)

请记住,您可能已经在ApplicationController中发生了一些资源授权,可能就是这样

class ApplicationController 
   authorize_resource || authorize! :admin, Object || load_and_authorize_resource etc
end
Run Code Online (Sandbox Code Playgroud)

所以请记住在非宁静/抽象控制器中使用skip_authorize_resource

class AbstractController < ApplicationController

   skip_authorize_resource

   def some_abstract_method
      authorize! :do_this, :on_this
   end
end
Run Code Online (Sandbox Code Playgroud)

现在管理员可以:do_this,:on_this并且将很好地授权.你可能想要在语义上更具名称,只是想强调任意性.

这都是使用Cancan 1.5,之前没有尝试过.

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