¿Cómo implementar una redirección en todas las solicitudes (bajo ciertas condiciones)?
-
01-07-2019 - |
Pregunta
Quiero configurar algo para que, si una cuenta dentro de mi aplicación está deshabilitada, quiera que todas las solicitudes sean redirigidas a un mensaje "deshabilitado".
He configurado esto en mi ApplicationController:
class ApplicationController < ActionController::Base
before_filter :check_account
def check_account
redirect_to :controller => "main", :action => "disabled" and return if !$account.active?
end
end
Por supuesto, esto no funciona del todo ya que entra en un bucle infinito si la cuenta no está activa.Esperaba usar algo como:
redirect_to :controller => "main", :action => "disabled" and return if !$account.active? && @controller.controller_name != "main" && @controller.action_name != "disabled"
pero noté que en Rails v2.1 (lo que estoy usando), @controller ahora es el controlador y esto no parece funcionar en ApplicationController.
¿Cuál sería la mejor manera de implementar algo como esto?
Solución
También podrías usar un skip_before_filter
para el controlador/método al que no desea que se aplique el filtro.
Otros consejos
Tienes varias opciones.
Si su método de acción "deshabilitado" tiene un nombre exclusivo en el alcance de la aplicación, puede agregar una excepción a la llamada before_filter, como esta:
before_filter :check_account, :except => :disabled
Si desea verificar específicamente el controlador y la acción en el filtro, debe tener en cuenta que este código ya forma parte del objeto del controlador.Puedes referirte a él como "yo", así:
def check_account
return if self.controller_name == "main" && self.action_name == "disabled"
redirect_to :controller => "main", :action => "disabled" and return if !$account.active?
end
Finalmente, si lo desea, puede sobrescribir el método de filtro desde MainController.rb:
def check_account
return if action_name == "disabled"
super
end
¿Qué tal si primero nos deshacemos de esa variable global $cuenta?Básicamente, te estás preparando para algunos errores graves al utilizar un archivo global.Simplemente use una variable de instancia en lugar de @ o mejor aún, cree un método en ApplicationController llamado current_account que acceda a la variable de instancia @current_account.
Si no hay demasiadas anulaciones, simplemente coloque if en el filtro de redireccionamiento
if acción! = discapacition redirect () final