Wie ein Redirect auf alle Anfragen implementieren (unter bestimmten Bedingungen)?
-
01-07-2019 - |
Frage
Ich möchte etwas so einrichten, dass, wenn ein Konto in meiner App deaktiviert ist, ich möchte, dass alle Anforderungen an einen „gesperrt“ Nachricht umgeleitet werden.
Ich habe dies in meiner Application einrichten:
class ApplicationController < ActionController::Base
before_filter :check_account
def check_account
redirect_to :controller => "main", :action => "disabled" and return if !$account.active?
end
end
Natürlich tut dies nicht ganz funktioniert, wie es in einer Endlos-Schleife geht, wenn das Konto nicht aktiv ist. Ich hatte gehofft, etwas zu verwenden, wie:
redirect_to :controller => "main", :action => "disabled" and return if !$account.active? && @controller.controller_name != "main" && @controller.action_name != "disabled"
, aber ich bemerkte, dass in Rails v2.1 (was ich verwende), @controller ist jetzt Controller und dies scheint nicht in Application zu arbeiten.
Was wäre der beste Weg, um so etwas zu implementieren?
Lösung
Sie können auch eine skip_before_filter
für den einen Controller / Methode verwenden Sie nicht wollen, die Filter haben, gelten.
Andere Tipps
Sie haben mehrere Möglichkeiten.
Wenn Ihre Aktion-Methode „disabled“ eindeutig in den Rahmen der Anwendung mit dem Namen ist, können Sie eine Ausnahme von der before_filter Anruf hinzufügen, wie folgt aus:
before_filter :check_account, :except => :disabled
Wenn Sie speziell für den Controller und die Aktion im Filter überprüfen möchten, sollten Sie beachten, dass dieser Code bereits Teil des Controller-Objekt ist. Sie können es als verweisen „Selbst“, etwa so:
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
Schließlich, wenn Sie möchten, können Sie die Filtermethode aus MainController.rb überschreiben:
def check_account
return if action_name == "disabled"
super
end
Wie wäre es erste dieser globalen Account Variable $ loszuwerden. Sie setzen im Grunde selbst für einige schwerwiegende Fehler, indem sie einen globalen verwenden. Verwenden Sie einfach eine Instanz Variable statt @ oder besser noch eine Methode erstellen, die auf Application current_account genannt, die die @current_account Instanzvariable zugreifen.
Wenn Theres nicht zu viele Überschreibungen dann setzen Sie einfach die, wenn in den Redirect-Filter
, wenn action! = Disabled umleiten() Ende