¿Cómo implementar una redirección en todas las solicitudes (bajo ciertas condiciones)?

StackOverflow https://stackoverflow.com/questions/89543

  •  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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top