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.