In einem Anfall von Unoriginalität, schreibe ich eine Blog-Anwendung mit Ruby on Rails. Meine PostsController
enthält Code, der sicherstellt, dass der angemeldete Benutzer nur seine eigenen Beiträge bearbeiten oder löschen kann.Rails: Benutzer Spoofing Checks halten DRY
Ich habe versucht, diesen Code in eine private Methode mit einem einzigen Argument für die Flash-Nachricht zu zeigen, aber wenn ich dies getan und testete es durch Bearbeiten eines anderen Autors Beitrag, bekam ich eine ActionController::DoubleRenderError
- "Kann nur rendern oder umleiten einmal pro Aktion ". Wie kann ich diese Überprüfungen DRY behalten? Der naheliegende Ansatz besteht darin, einen Vorher-Filter zu verwenden, aber die destroy
-Methode muss einen anderen Flash anzeigen.
Hier ist der entsprechende Controller-Code:
before_filter :find_post_by_slug!, :only => [:edit, :show]
def edit
# FIXME Refactor this into a separate method
if @post.user != current_user
flash[:notice] = "You cannot edit another author’s posts."
redirect_to root_path and return
end
...
end
def update
@post = Post.find(params[:id])
# FIXME Refactor this into a separate method
if @post.user != current_user
flash[:notice] = "You cannot edit another author’s posts."
redirect_to root_path and return
end
...
end
def destroy
@post = Post.find_by_slug(params[:slug])
# FIXME Refactor this into a separate method
if @post.user != current_user
flash[:notice] = "You cannot delete another author’s posts."
redirect_to root_path and return
end
...
end
private
def find_post_by_slug!
slug = params[:slug]
@post = Post.find_by_slug(slug) if slug
raise ActiveRecord::RecordNotFound if @post.nil?
end
Keine Abfrage vor dem Auth-Check! –
@Pedro Sie müssen mir erklären, wie Sie die Berechtigung (nicht die Authentifizierung) basierend auf einem bestimmten Modell überprüfen können, bevor Sie eine Kopie dieses Modells haben. :) –
Ihre Autorisierungsmethode macht 0 Anfragen. Sie suchen nach, bevor Sie überprüfen, ob der Benutzer berechtigt ist oder nicht. –