1

これは私の Ability.rb ファイルです:

class Ability
  include CanCan::Ability

  def initialize(user)
    user.permissions.each do |permission|
      can permission.action.to_sym,
          permission.thing_type.constantize {|thing| thing.nil? || permission.thing.nil? || permission.thing_id == thing.id}
    end
  end
end

モノは多態的な関連付けです。ブロックを can に渡す方法を理解しようとしています。ウィキ全体で CanCan を検索しましたが、説明を見つけることができませんでした。

4

1 に答える 1

1

ブロックを cancan に渡すと、オブジェクト自体の状態に依存する、より複雑な権限チェックを実装できます。

チェックしたいオブジェクトの属性だけの場合、ブロックは必要ありません。

can :read, Project, :active => true

ユーザーはアクティブなプロジェクトのみを読み取ることができます。editableプロジェクトのメソッドを呼び出す必要がある場合は、代わりに行うことができます

can :read, Project do |project|
  project.editable?
end

cancan が特定のプロジェクトを読み取ることができるかどうかをチェックする時点で (つまり、 が起動したとき、before_filterまたは `can? :read, some_project を呼び出したとき)、ブロックが呼び出されます。

wiki にこれに関するページがあります: Defining capabilities with blocks .

thing_typeあなたの場合、権限オブジェクトがクラス全体(設定されているthing_idがnullの場合)またはクラスの特定のインスタンスへのアクセスを許可できるという意図があるようです。

ただし、投稿したコードは実際にはこれを行いません。ブロックを渡す2つの方法のうち、ブロックがまったく渡されない{}よりも強くバインドされます。代わりに に渡されますが、これは無視されます。括弧を使用するか、do...endcanconstantizedo...end

于 2013-08-25T08:59:07.950 に答える