2014-01-31 21 views
11

Ich habe gerade von CanCan zu Pundit gewechselt. Ich bin unsicher, was ein paar Dinge sind und wie Pundit am besten genutzt wird. Beispielsweise.Wie benutzt man Pandit Scopes?

Wenn Sie eine Ressource haben, die mehrere Elternobjekte haben kann, sagen wir zum Beispiel, dass ein Ziel einem Schüler und Lehrer gehört. Daher kann ein Schüler viele Ziele haben und ein Ausbilder kann viele Ziele haben. In einer Controller-Indexaktion könnten Sie Folgendes tun:

Parameter sind in Richtlinien nicht verwendbar, daher muss die Logik hier ausgeführt werden. Ich denke. Was ich sagen kann, wenn Sie das policy_scope überspringen, erhalten Sie einen unautorisierten Fehler beim Anzeigen der Indexseite für Ziele.

Möchten Sie:

@goals = policy_scope(@account.goals) 

ODER

@goals = policy_scope(Goal.scoped).where(account_id: @account.id) 

Was passiert, wenn Sie ein Bündel enthält in der Mischung zu werfen?

@example = policy_scoped(@school.courses.includes(:account => :user, :teacher)) 

Oder wenn benötigt, um zu bestellen ... ist das korrekt? policy_scope (Issue.scoped) .order ("created_at desc")

Bei der Verwendung von Bereichen: Was ist: Bereich hier? Ist: scope eine Instanz des Modells, das evaluiert wird? Ich habe versucht, seine Attribute über: Scope, aber nicht funktioniert.

class Scope < Struct.new(:user, :scope) 

Antwort

14

durch diese aus Sicht der Sicherheit Lesen Ich kann ein paar Dinge, die erwähnens tragen. Wenn Sie beispielsweise zulassen, dass Benutzer die Parameterfelder student_id und instructor_id angeben, was hindert sie daran, eine ID für eine andere Person als sie selbst zu übergeben? Sie möchten einem Benutzer niemals vorgeben, wer er ist, insbesondere wenn Sie Richtlinien für den Benutzertyp festlegen.

Für den Anfang würde ich Devise implementieren und ein zusätzliches boolean Feld instructor genannt hinzufügen, die true sein würde, wenn der Benutzer ein Lehrer aber standardmäßig false für Studenten ist.

Dann würde dein User s automatisch eine instructor? Methode definiert haben, die true, wenn der Wert in der Spalte instructor zurück true ist.

Sie könnten dann einen Helfer für Studenten hinzufügen:

def student? 
    !instructor? 
end 

Jetzt Devise mit (was uns den Zugang zu einer current_user Variable gibt) wir Dinge wie current_user.instructor? tun können, die true zurück, wenn sie ein Ausbilder sind.

Nun zu der Richtlinie selbst.Ich habe gerade angefangen vor ein paar Wochen mit Pandit, aber das ist, was ich in Ihrer Situation tun würde:

class GoalPolicy < ApplicationPolicy 
    class Scope < GoalPolicy 
    attr_reader :user, :scope 

    def initialize(user, scope) 
     @user = user 
     @scope = scope 
    end 

    def resolve 
     @scope.where(user: @user) 
    end 
    end 
end 

Dann wird Sie (Ich gehe davon aus GoalsController Klasse und index Methode) Methode kann wie folgt aussehen:

def index 
    policy_scope(Goal) # To answer your question, Goal is the scope 
end 

Wenn Sie könnten Sie auch tun

def index 
    policy_scope(Goal).order(:created_at) 
end 

ich habe erkannt, dass Sie diese Frage gestellt vor einem halben Jahr, aber hey bestellen wollte! Vielleicht beantwortet es einige Fragen, die andere Leute haben, und vielleicht werde ich ein paar Rückmeldungen zu meinen eigenen aufstrebenden Pundit-Fähigkeiten bekommen.