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で述べたように
こんにちはマークを、(ありがとう!)私はそれをテストし、期待どおりに動作します。私はそれが実際に何をしているのかちょっと混乱しています。私は 'skip_authorization_check:only =>:index'も追加しなければなりませんでした。私のリソースがまったく承認されていないということですか?どのようにインデックスがすべてのリソース(私が認可されていないリソースを含む)を表示しないのでしょうか? load_resourceの部分は何も読み込めないほどスマートですか? – karellm
@kalema、 'load_and_authorize_resource'は単純に訴求権(またはコレクション)を読み込み、承認を実行します。したがって、承認のスキップを直接設定した場合は、読み込みのみが実行されます。 [docs](https://github.com/ryanb/cancan/blob/master/lib/cancan/controller_additions.rb)を参照してください。 –