no sigo plenamente la descripción (? Sería un comentario realmente ser propiedad del dueño del viaje), pero en expansión ligeramente sobre la respuesta de jonnii, aquí es un ejemplo que restringe el controlador viaje:
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
suponiendo que el modelo se parece a esto:
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
el método login_required
(proporcionados por o depender de un complemento auth como restful_authentication o authlogic) se asegura de que el usuario está conectado y proporciona al usuario una current_user
método, get_trip
establece la variable de instancia de viaje que luego se marca en require_owner
.
Este mismo patrón se puede adaptar a casi cualquier otro recurso, siempre que el modelo haya implementado el método is_owned_by?
. Si usted está tratando de comprobar que cuando el recurso es un comentario, entonces sería en el CommentsController
:
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
con un modelo que se parece a Comment
:
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
Asegúrese de comprobar la Registre registros mientras hace esto, ya que las comprobaciones dependientes de la asociación pueden convertirse en muchas consultas si no tiene cuidado.
Esta es una gran adición, definitivamente hay que pensar mucho entre esto y acl9. – jonnii
Gran respuesta. Intenté esta solución y acl9 de las recomendaciones a continuación. Terminó usando acl9. Desearía poder seleccionar dos respuestas correctas para esta pregunta ... – Gavin