44 votes

Rails : rendre et sortir immédiatement

En utilisant la gemme omniauth, je suis obligé de définir un seul rappel d'itinéraire pour les connexions réussies, quel que soit le fournisseur :

def auth_callback 

        auth_data = request.env['omniauth.auth']

        if auth_data.has_key('something')
            process_one(auth_data)
        else
            process_two(auth_data)
        end

        # No view is available here

end


def process_one
    # do something then render view for process_one
    return
end

def process_two
    # do something then render view for process_two
    return
end

Comment puis-je empêcher le contrôleur de revenir à la méthode auth_callback et essayer d'afficher la vue correspondante (qui n'existe pas) ? Le traitement doit être considéré comme terminé une fois que les méthodes process_one ou process_two sont revenues.

100voto

Kelly Points 8780

Pourquoi ne pas appeler spécifiquement render dans ces méthodes ?

def process_one
 # do something then render view for process_one
 render :process_one and return
end

Les rails devraient détecter que vous l'avez déjà exécuté et ne pas essayer de le restituer à nouveau.

2voto

Ngoral Points 615

Si vous souhaitez revenir de la chaîne de méthodes, par exemple

def a
  ...
  b
  ...
  render "smth"
end
...
def b
  ...
  # render from some conditional from here
  ...
end

causera AbstractController::DoubleRenderError, ce qui signifie que vous appelez render deux fois.

Vous pouvez lire cet article pour découvrir 4 façons de gérer une telle situation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X