4

Rails3アプリにcancan1.5.0を追加しました。これが私の能力ファイルです-

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メソッドは権限を定義するために使用され、2つの引数が必要です。1つ目は、アクセス許可を設定しているアクションであり、2つ目は、設定しているオブジェクトのクラスです。

したがって、問題は、PageCanCanがアクセスを管理するためのクラスがシステムにないことです。

CanCanは次のように構築されていることに注意してください:(私が強調したもの)

特定のユーザーがアクセスできるリソースを制限するRubyonRailsの認証ライブラリ。

したがって、レールリソースがアタッチされていない抽象的な概念を制御することを目的としている場合は、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

したがって、非RESTful/抽象コントローラーでskip_authorize_resourceを忘れないでください

class AbstractController < ApplicationController

   skip_authorize_resource

   def some_abstract_method
      authorize! :do_this, :on_this
   end
end

これで、管理者は:do_this、:on_thisを実行でき、適切に承認されます。おそらく、能力にもう少し意味的に名前を付けたいと思うでしょう。ただ恣意性を強調したかっただけです。

これはすべてCancan1.5を使用しており、これまで何も試していません。

https://github.com/ryanb/cancan/wiki/Non-RESTful-Controllersから

于 2012-04-03T05:59:28.210 に答える