2010-03-05 16 views
57

Los nombres y los objetos se han simplificado por razones de claridad. El concepto básico sigue siendo el mismo.Omitir before_filter en Rails

Tengo tres controladores: dog, cat y horse. Todos estos controladores heredan del controlador animal. En el controlador animal, tengo un filtro antes de 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 (saltar la autenticación).

Si tuviera que escribir la autenticación por separado para dog, podría hacer algo como esto:

before_filter :authenticate, :except => :show 

Pero desde dog hereda de animal, que no tienen acceso a las acciones de controlador específico. Agregar :except => :show en el controlador animal no solo omitirá la autenticación para la acción show de dog, sino también la de cat y horse. Este comportamiento no es deseado.

¿Cómo puedo omitir la autenticación solo para la acción show de dog mientras sigo heredando de animal?

Respuesta

107
class Dog < Animal 
    skip_before_filter :authenticate, :only => :show 
end 

Ver ActionController::Filters::ClassMethods para obtener más información sobre los filtros y herencia.

+2

'skip_before_filter' parece estar en desuso >> [http://apidock.com/rails/ActionController/Filters/ClassMethods/skip_before_filter#1083-deprecated-moved](http://apicock.com/rails/ActionController/ Filters/ClassMethods/skip_before_filter # 1083-deprecated-moved) Recomiendan usar 'skip_filter' que está llamando' skip_before_filter', 'skip_after_filter' y' skip_around_filter' todos juntos. – Bachet

+4

no no es ... simplemente mueven el método a otra clase, http://apidock.com/rails/v3.2.3/AbstractController/Callbacks/ClassMethods/skip_before_filter – Orlando

+0

sí se ha movido –

3

Para ello se puede utilizar skip_before_filter

Se explica en el Rails API

En su ejemplo dog simplemente tendría que contener

skip_before_filter :authenticate 
12

Las dos respuestas dadas son a la derecha. Con el fin de evitar hacer todas sus acciones perro abierta, que necesita para calificar la skip_before_filter que sólo se aplican a la acción 'show' de la siguiente manera:

class Dog < Animal 
    skip_before_filter :authenticate, :only => :show 
end 
2

Sólo una pequeña actualización que el uso de los carriles 4, ahora es skip_before_action :authenticate, :only => :show y que before_filters ahora debería usar before_action en su lugar.

+0

Esto debería ser un comentario. – dan

Cuestiones relacionadas