2009-01-26 8 views
0

OK, comme c'est souvent le cas, j'ai une action de contrôleur dans mon application qui est protégée contre un accès non autorisé par un before_filter. La seule chose est que je dois rediriger cette action si une autre condition est vraie:Comment vérifier si une action du contrôleur est déjà en cours de redirection?

class Payment < ApplicationController 
    before_filter login_required 

    def new 
    redirect_to some_other_path if @order.is_free? 
    @payment = Payment.new 
    end 
end 

Dans mes tests, je vérifie pour vous assurer que l'action est toutefois protégé correctement, il est également vrai que le @ La commande order.is_free est vraie. Si tel est le cas, je reçois l'erreur suivante:

`render_with_no_layout': Can only render or redirect once per action 

Est-il possible de vérifier pour vous assurer que je ne suis pas déjà redirigeant ou pour remplacer une redirection existante?

Répondre

3

Je suppose que la méthode login_required effectue une redirection si l'utilisateur n'est pas connecté Dans ce cas:.

Votre avant filtre doit retourner false après avoir appelé redirect. Cela empêchera la nouvelle action d'être appelée. Les versions ultérieures de rails le font automatiquement si vous appelez render ou redirect dans un before_filter, alors peut-être que vous utilisez une version plus ancienne.

Vous devriez également retourner après l'appel pour rediriger dans le nouveau gestionnaire, sauf si vous voulez toujours créer un nouvel objet de paiement.

0

Je ne pense pas que votre filtre avant est ce qui provoque l'erreur de rendu double. Jetez un oeil à cet exemple:

class PostsController < ApplicationController 
    before_filter :perform_a_redirect, :except => [:wtf] 

    def index 
    redirect_to 'http://google.com' 
    end 

    def wtf 
    render :text => 'wtf' 
    end 

    private 

    def perform_a_redirect 
    redirect_to :action => 'wtf' 
    end 
end 

Lors de la visite/messages, je redirigés vers/messages/wtf. Aucune erreur de rendu double. En supposant que votre méthode 'login_required' ne redirige/rend qu'une seule fois, je suppose que le code que vous publiez ici n'est pas le problème, mais que quelque chose d'autre en est la cause.

0

Le filtre avant est un hareng rouge. Lorsque @order_is_free? le code est à la fois une redirection et tombant à un rendu de nouveau. L'instruction de redirection ne contrôle pas le flux de la méthode. Ajouter une déclaration de retour après la redirection, ou vous pouvez même retourner la redirection, comme dans return(redirect_to :action => :show, :id => @order, :controller => :free_orders)

2

Votre classe devrait être PaymentController, pas de paiement. La raison en est que la classe de contrôleur et la classe de modèle ne s'affrontent pas.

Questions connexes