2012-04-11 5 views
1

私の許可は、CanCan wikiに記載されているようなデータベースで定義されています。私は:indexを私のアクセス許可テーブルのIDだけに許可したいが、リソースが許可されていなければインデックスページを表示する。CanCanのデータベースとload_resourceの能力

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の制約とインデックス::のための機能を追加し、[](何も)、その後、私のデータベースの権限でそれを上書きします。

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?

もっとクリーンなソリューションをお考えですか? docsで述べたように

答えて

1

あなたはヘルパーメソッドを使用する必要があります

skip_authorize_resource :only => :index 
+0

こんにちはマークを、(ありがとう!)私はそれをテストし、期待どおりに動作します。私はそれが実際に何をしているのかちょっと混乱しています。私は 'skip_authorization_check:only =>:index'も追加しなければなりませんでした。私のリソースがまったく承認されていないということですか?どのようにインデックスがすべてのリソース(私が認可されていないリソースを含む)を表示しないのでしょうか? load_resourceの部分は何も読み込めないほどスマートですか? – karellm

+0

@kalema、 'load_and_authorize_resource'は単純に訴求権(またはコレクション)を読み込み、承認を実行します。したがって、承認のスキップを直接設定した場合は、読み込みのみが実行されます。 [docs](https://github.com/ryanb/cancan/blob/master/lib/cancan/controller_additions.rb)を参照してください。 –

関連する問題