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
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ß. –