Comment implémenter une redirection sur toutes les demandes (sous certaines conditions)?
-
01-07-2019 - |
Question
Je souhaite configurer quelque chose pour que, si un compte de mon application soit désactivé, je souhaite que toutes les demandes soient redirigées vers un message "désactivé". message.
J'ai configuré cela dans mon 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
Bien sûr, cela ne fonctionne pas tout à fait, car le processus est bouclé si le compte n’est pas actif. J'espérais utiliser quelque chose comme:
redirect_to :controller => "main", :action => "disabled" and return if !$account.active? && @controller.controller_name != "main" && @controller.action_name != "disabled"
mais j'ai remarqué que dans Rails v2.1 (ce que j'utilise), @controller est maintenant contrôleur et que cela ne semble pas fonctionner dans ApplicationController.
Quel serait le meilleur moyen de mettre en œuvre quelque chose comme ça?
La solution
Vous pouvez également utiliser un skip_before_filter
pour le contrôleur / la méthode à laquelle vous ne voulez pas que le filtre s'applique.
Autres conseils
Vous avez plusieurs options.
Si votre méthode d'action "quotient" " nommé de manière unique dans le champ d'application, vous pouvez ajouter une exception à l'appel before_filter, comme ceci:
before_filter :check_account, :except => :disabled
Si vous souhaitez vérifier spécifiquement le contrôleur et l'action dans le filtre, notez que ce code fait déjà partie de l'objet contrôleur. Vous pouvez vous y référer en tant que "soi-même". comme si:
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
Enfin, si vous le souhaitez, vous pouvez remplacer la méthode de filtrage depuis MainController.rb:
def check_account
return if action_name == "disabled"
super
end
Pourquoi ne pas commencer par se débarrasser de cette variable globale compte $. En gros, vous vous préparez à commettre des bugs sérieux en utilisant un problème global. Utilisez simplement une variable d'instance à la place @ ou mieux encore, créez une méthode sur ApplicationController appelée current_account qui permet d'accéder à la variable d'instance @current_account.
S'il n'y a pas trop de remplacements, il suffit de mettre le if dans le filtre de redirection
si action! = désactivé réorienter() fin