ruby-on-rails - only - ruby on rails mvc
Omitir before_filter en Rails (4)
Las dos respuestas dadas son a medias correctas. Para evitar que todas las acciones de tu perro se abran, debes calificar skip_before_filter para aplicar solo a la acción ''mostrar'' de la siguiente manera:
class Dog < Animal
skip_before_filter :authenticate, :only => :show
end
Los nombres y objetos se han simplificado por motivos de claridad. El concepto básico sigue siendo el mismo.
Tengo tres controladores: dog
, cat
y horse
. Todos estos controladores heredan del animal
controlador. En el animal
controlador, tengo un filtro anterior que autentica a un usuario como tal:
before_filter :authenticate
def authenticate
authenticate_or_request_with_http_basic do |name, password|
name == "foo" && password == "bar"
end
end
En la acción show
de dog
, necesito tener acceso abierto a todos los usuarios (omita la autenticación).
Si tuviera que escribir la autenticación por separado para el dog
, podría hacer algo como esto:
before_filter :authenticate, :except => :show
Pero dado que el dog
hereda de un animal
, no tengo acceso a las acciones específicas del controlador. Agregar :except => :show
en el controlador de animal
no solo omitirá la autenticación para show
acción de un dog
, sino también la de cat
y horse
. Este comportamiento no es deseado.
¿Cómo puedo omitir la autenticación solo para show
acción del dog
mientras sigo heredando de un animal
?
Para esto puedes usar skip_before_filter
Se explica en la API de Rails
En tu ejemplo, el dog
solo debería contener
skip_before_filter :authenticate
Solo una pequeña actualización que usa rails 4, ahora es skip_before_action :authenticate, :only => :show
y que before_filters debería usar before_action
en before_action
lugar.
class Dog < Animal
skip_before_filter :authenticate, :only => :show
end
Consulte ActionController::Filters::ClassMethods para obtener más información sobre filtros y herencia.