1

私の権限は、 CanCanwikiで説明されているようなデータベースで定義されています。:index権限テーブルのIDのみを承認したいのですが、リソースが承認されていない場合でもインデックスページを表示します。

を使用するload_and_authorize_resourceと、権限に基づいてリソースが読み込まれます。持っていない場合、indexアクションにアクセスできません。リソースでアクセスが拒否されました。

:indexリソースが許可されていない状態でアクションへのアクセスを許可したい場合は、次の2つのオプションが表示されます。

オプション1(嫌い) :インデックスのリソースを手動でロードします。

class FirmsController < ApplicationController
  load_and_authorize_resource :except => :index

  def index
    @firms = user.permissions.where{action: ["index", "manage", "read"], subject_class: "Firm"}
  end
end

オプション2(meh):id:[](nothing)の制約を持つ:indexの機能を追加し、後でデータベースのアクセス許可で上書きします。

class Ability
  include CanCan::Ability

  def initialize(user)

    user ||= User.new # guest user (not logged in)

    can :create, Firm
    can :index, Firm, id: []

    user.permissions.each do |permission|
      if permission.subject_id.nil?
        can permission.action.to_sym, permission.subject_class.constantize
      else
        can permission.action.to_sym, permission.subject_class.constantize, :id => permission.subject_id
      end
    end

  end
end

オプション3?

よりクリーンなソリューションを考えられますか?

4

1 に答える 1

1

ドキュメントに記載されているように、ヘルパーメソッドを使用する必要があります。

  skip_authorize_resource :only => :index
于 2012-04-11T21:00:39.527 に答える