0

CanCan のユーザー権限を定義するこのコードがありますが、ブロック内の条件が何のためにあるのかわかりません。

    class Ability
          include CanCan::Ability

          def initialize(user)

            user.permissions.each do |permission|
              can permission.action.to_sym,
              permission.thing_type.constantize do |thing|
               thing.nil? || permission.thing_id.nil? || permission.thing_id == thing.id
              end
            end


end
end

したがって、このコード行は私を悩ませています:

permission.thing_type.constantize do |thing|
       thing.nil? || permission.thing_id.nil? || permission.thing_id == thing.id
end

複雑な条件を定義するためにブロックが使用されていることを理解しています permission.thing_id == thing.id。選択したオブジェクトに対してのみアクセス許可が付与されるようにブロックが存在すると思いますが、その目的はわかりません。それは thing.nil? || permission.thing_id.nil?何のためですか?

4

1 に答える 1

0

したがって、CanCan docs によると、ブロックを渡すとcan(これがここで起こっていることです)、ブロックが true を返す場合にのみ許可が与えられます。ブロックに渡されるオブジェクトは、ユーザーが何かを実行する権限を持っている可能性があるオブジェクトです。

これにより、次の場合permission.actionにクラスで実行する権限がユーザーに与えられます。permission.thing_type

  1. thingはゼロです。これは、createパーミッションなど、特定のオブジェクトを取らない (代わりにクラスを取る) 場合に発生する可能性があります。
  2. permission.thing_idはゼロです。Permissionこれは、オブジェクトが特定のものを指していない場合を扱っています。これは、項目 1 の反対側のように感じます。「ブランケット」パーミッションの場合に適用される可能性があります。これは、特定のユーザーがこのクラスの任意のオブジェクトに対してこのアクションを実行できることを示すパーミッションです。また
  3. にはthing、権限オブジェクトで指定された ID があります。

教訓: コードにコメントを付けてください。何かが何をするのかが今のあなたには明らかであっても、次の人にはそうではないかもしれません. 数か月後、あなたも誰になるかもしれません。

于 2013-09-25T16:37:34.247 に答える