2016-04-18 16 views
1

Ich habe ein Blog Modell, das verschiedene Zustände hat. Um einen mageren Controller zu behalten und der Konvention zu folgen, nur CRUD-Operationen pro Controller zu haben, folgte ich DHH's namespacing controllers pattern und nannte den Blog Controller.Pundit: autorisieren Aktionen innerhalb namespaced Controller

Jetzt habe ich einen Blogs::NewDraft Controller, einen Blogs::AwaitingApproval Controller und einen Blogs::Active Controller.

Das Problem ist mit Schreiben meiner Richtlinien, um die Aktionen innerhalb dieser Namespace-Controller zu autorisieren. Alle Aktionen in allen Namespace-Controllern autorisieren das gleiche Blog Modellobjekt. Das Problem ist, dass ich jede der Namensraum-Steuerungen muß in einer passenden Namensraum Politik genehmigen

Basic-Beispiel (wie innerhalb derselben blog_policy.rb Datei ermächtigt alle des Namensraum-Controller gegenüber.): Für einen erholsamen Ressource mit einem erholsamen Controller, der nicht Namespace wird tun Sie es so etwas wie dieses:

#app/controllers/blogs_controller.rb 
class BlogsController < ApplicationController 
    def index 
    authorize :blog 
    @blogs = Blog.all 
    end 

    def show 
    @blog = Blog.find(1) 
    authorize @blog 
    end 
end 

Und jetzt die passende Politik

#app/policies/blogs_policy.rb 
class BlogPolicy < ApplicationPolicy 
    def index? 
    user.admin? 
    end 

    def show? 
    record.author == current_user 
    end 
end 

Sie tun es so, dass, wenn Sie d On't-Namespace.


aktuellen Code Versuchen von Namensräumen zu bekommen mit Pundit zu arbeiten: Ich bin Namensräume. Ich Ermächtigung noch ein Blog Objekt, aber ich brauche die Aktionen innerhalb der einzelnen Namensraum-Controller innerhalb einer Namensraum Politik zu genehmigen:

#app/controllers/blogs/new_drafts.rb 
class Blogs::NewDraftsController < ApplicationController 
    def index 
    # doesn't work 
    authorize Blog::NewDrafts 
    @blogs = Blog.new_drafts 
    end 
    def show 
    @blog = Blog.find(1) 
    #doesn't work either 
    authorize @blog, Blog::NewDraft 
    end 
end 

Deshalb möchte ich, dass Namespaced-Controller NICHT Weg zu app/policies/blog_policy.rb, sondern zu app/policies/blogs/new_draft_policy.rb

#app/policies/blogs/new_draft_policy.rb 
class Blogs::NewDraftPolicy < ApplicationPolicy 
    def index? 
    user.admin? 
    end 

    def show? 
    # the record is a blog from the Blog Model 
    record.author == current_user 
    end 
end 

Pundit Documentation and Usage

+0

Ich denke, die Namenskonvention der Politik mehr mit dem Modellobjekt zu tun hat als mit Der Controller. Wenn das Modellobjekt selbst keinen Namensraum hat, wird das, was Sie versuchen, nicht funktionieren. Pundit sendet die Aktion im Autorisierungsmethoden-Aufruf, aber ich denke nicht, dass er etwas anderes über den Controller weiß. –

Antwort

1

Sie wissen nicht, wie zu routen Politik Namensraum und in dem Blog Rekord passieren. Allerdings: unten ist, wie Sie es tun, wenn Ihr Namensraum Politik nur zu genehmigen, ist in der Lage, basierend auf die Berechtigungen/Rollen des aktuellen Benutzers:

#app/controllers/blogs/new_drafts.rb 
class Blogs::NewDraftsController < ApplicationController 
    def index 
    authorize [:blogs, :new_draft] 
    @blogs = Blog.new_drafts 
    end 
end 

#app/policies/blogs/new_draft_policy.rb 
class Blogs::NewDraftPolicy < ApplicationPolicy 
    def index? 
    user.admin? 
    end 
end 
Verwandte Themen