Come implementare un reindirizzamento su tutte le richieste (a determinate condizioni)?

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

  •  01-07-2019
  •  | 
  •  

Domanda

Voglio impostare qualcosa in modo che se un account all'interno della mia app è disabilitato, voglio che tutte le richieste vengano reindirizzate a un messaggio "disabilitato".

L'ho impostato nel mio 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

Naturalmente, questo non funziona del tutto poiché entra in un ciclo infinito se l'account non è attivo.Speravo di usare qualcosa del tipo:

redirect_to :controller => "main", :action => "disabled" and return if !$account.active? && @controller.controller_name != "main" && @controller.action_name != "disabled"

ma ho notato che in Rails v2.1 (quello che sto usando), @controller ora è controller e questo non sembra funzionare in ApplicationController.

Quale sarebbe il modo migliore per implementare qualcosa di simile?

È stato utile?

Soluzione

Potresti anche usare a skip_before_filter per il controller/metodo a cui non vuoi applicare il filtro.

Altri suggerimenti

Hai diverse opzioni.

Se il tuo metodo di azione "disabled" ha un nome univoco nell'ambito dell'applicazione, puoi aggiungere un'eccezione alla chiamata before_filter, in questo modo:

before_filter :check_account, :except => :disabled

Se desideri controllare specificamente il controller e l'azione nel filtro, tieni presente che questo codice fa già parte dell'oggetto controller.Puoi riferirti ad esso come "sé", in questo modo:

  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

Infine, se lo desideri, puoi sovrascrivere il metodo filter da MainController.rb:

  def check_account
    return if action_name == "disabled"
    super
  end

Che ne dici di sbarazzarti prima della variabile globale $account.Fondamentalmente ti stai preparando per alcuni bug gravi utilizzando un global.Basta usare invece una variabile di istanza @ o, meglio ancora, creare un metodo su ApplicationController chiamato current_account che acceda alla variabile di istanza @current_account.

Se non ci sono troppe sostituzioni, inserisci semplicemente if nel filtro di reindirizzamento

Se azione! = Disabile Redirect () End

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top