Come implementare un reindirizzamento su tutte le richieste (a determinate condizioni)?
-
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?
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