Comment implémenter une redirection sur toutes les demandes (sous certaines conditions)?

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

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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top