2016-08-25 3 views
3

私は最近、宝石のREADMEを読んで、コントローラ内のインデックスビューを承認しないことに気付きました。 (代わりにスコープを使用します)。インデックス内のPundit権限

索引ページには一般に要素のリストが含まれており、生成されたリストを制御することで、ページ上のデータを効果的に制御するため、これらは良い理由があります。ただし、索引ページ自体へのアクセスをブロックすることが必要な場合もあります。 (空白のインデックスページへのアクセスを許可するのではなく)私の質問は、これを実行する適切な方法は何でしょうか?

私はこれまで、いくつかの可能性を思い付くし、次のクラスを持っている:私のインデックスで

  • モデルMyModel
  • コントローラMyModelsController
  • ポリシーMyModelPolicy

私のコントローラの方法では、これを解決するための推奨される方法は次のようになります:

def index 
    @my_models = policy_Scope(MyModel) 
end 

これにより、インデックスページへのアクセスが許可されますが、使用結果が表示できるもののみにフィルタリングされます。 (EGには無いのアクセスになりません。)しかし

は、私は2つの異なる可能性に到着したインデックス・ページ自体へのアクセスブロックするために:

def index 
    @my_models = policy_Scope(MyModel) 
    authorize @my_models 
end 

または

def index 
    @my_models = policy_Scope(MyModel) 
    authorize MyModel 
end 

これらのだろうが正しいパスか、それとも優先される別の選択肢がありますか?

+0

は、基準作成のためかどうかは何ですか?スコープが空であるかどうか – Leito

+0

私は同じ問題を抱えてきました。私は間違っているかもしれませんが、ポイントは、インデックスページへのアクセスをブロックするのは、Punditの仕事ではないということです。認可の観点から、空の索引ページを持つことは、索引を持たないことと同じです。ユーザーはレコードを見る権限がありません。場合によっては、あなたの場合のように、ユーザーはインデックスページへのリンクも見てはいけませんが、_autability_懸念事項ではなく_usability_懸念事項なので、Punditのビジネスではありません。 – abl

答えて

3

方針、

class MyModelPolicy < ApplicationPolicy 
    class Scope < Scope 
    def resolve 
     if user.admin? 
     scope.all 
     else 
     scope.where(user: user) 
     end 
    end 
    end 

    def index? 
    user.admin? 
    end 
end 

コントローラ、

def index 
    @my_models = policy_scope(MyModel) 
    authorize MyModel 
end 
+0

私はPunditがより洗練されたソリューションを持っていることを期待しました。 –