ich nicht ganz der Beschreibung folgen (? Wäre ein Kommentar wirklich von der Reise Eigentümer gehört werden), aber leicht auf jonnii Antwort erweitert, hier ist ein Beispiel, das die Reise Controller beschränkt:
class ApplicationController < ActionController::Base
...
protected
# relies on the presence of an instance variable named after the controller
def require_owner
object = instance_variable_get("@#{self.controller_name.singularize}")
unless current_user && object.is_owned_by?(current_user)
resond_to do |format|
format.html { render :text => "Not Allowed", :status => :forbidden }
end
end
end
end
class TripsController < ApplicationController
before_filter :login_required # using restful_authentication, for example
# only require these filters for actions that act on single resources
before_filter :get_trip, :only => [:show, :edit, :update, :destroy]
before_filter :require_owner, :only => [:show, :edit, :update, :destroy]
...
protected
def get_trip
@trip = Trip.find(params[:id])
end
end
das Modell unter der Annahme, sieht wie folgt aus:
class Trip < ActiveRecord::Base
belongs_to :owner, :class_name => 'User'
...
def is_owned_by?(agent)
self.owner == agent
# or, if you can safely assume the agent is always a User, you can
# avoid the additional user query:
# self.owner_id == agent.id
end
end
die login_required
Verfahren (zur Verfügung gestellt von oder auf einem auth Plugin wie restful_authentication verlassen oder authlogic) stellt sicher, dass der Benutzer angemeldet ist und bietet dem Benutzer eine current_user
method, get_trip
setzt die Trip-Instanzvariable, die dann in require_owner
überprüft wird.
Das gleiche Muster kann an nahezu jede andere Ressource angepasst werden, sofern das Modell die is_owned_by?
-Methode implementiert hat. Wenn Sie versuchen, es zu überprüfen, wenn die Ressource ist ein Kommentar, dann würden Sie im CommentsController
sein:
class CommentsController < ApplicationController
before_filter :login_required # using restful_authentication, for example
before_filter :get_comment, :only => [:show, :edit, :update, :destroy]
before_filter :require_owner, :only => [:show, :edit, :update, :destroy]
...
protected
def get_comment
@comment = Comment.find(params[:id])
end
end
mit einem Comment
Modell, das wie folgt aussieht:
class Comment < ActiveRecord::Base
belongs_to :trip
# either
# delegate :is_owned_by?, :to => :trip
# or the long way:
def is_owned_by?(agent)
self.trip.is_owned_by?(agent)
end
end
Stellen Sie sicher, das überprüfen Protokolle, wie Sie dies tun, da assoziationsabhängige Prüfungen in viele Abfragen aufsteigen können, wenn Sie nicht vorsichtig sind.
Dies ist eine großartige Ergänzung, definitiv viel darüber nachdenken zwischen diesem und acl9. – jonnii
Große Antwort. Ich habe diese Lösung und die folgenden Empfehlungen ausprobiert. Beendet mit acl9. Ich wünschte, ich könnte zwei richtige Antworten für diese Frage auswählen ... – Gavin