2011-06-09 1 views
0

Ceci est ma première question ici et je suis actuellement en train d'essayer de construire ma première application Ruby on Rails donc cette question pourrait être un peu basique.Comment faire pour transférer/router des demandes en fonction des conditions dans Rails 3?

Le problème:

Je veux un formulaire sur le site racine qui se compose de deux champs, e-mail et mot de passe pour un modèle utilisateur. Selon que l'adresse e-mail qui a été tapée existe déjà ou non, le formulaire doit transmettre la requête à l'utilisateur 'users # create' (c.-à-d. Créer un nouvel utilisateur) ou aux 'sessions # create'. . si le mot de passe est correct)

ce que j'ai essayé:

pour résoudre cela, je créé une nouvelle action dans le contrôleur de pages appelé « décider » et a souligné la forme à cette page.

Il ressemble fondamentalement ceci:

def decide 
    if User.find_by_email(params[:email]) 
    # Copied in all of the code from sessions#create 
    # with a redirect at the end so a /decide page doesn't get rendered 
    else 
    # Copied in all of the code from users#create 
    # with a redirect at the end so a /decide page doesn't get rendered 
    end 
end 

-

Maintenant, cela fonctionne et je suis assez fier de moi-même que je pensais que ce comme un débutant, mais je peux entendre les programmeurs expérimentés criant à l'agonie à ce code. Je suis sûr que ce n'est pas le "Rails Way". Je répète une grande quantité de code et j'ai l'impression de mettre quelque chose dans un contrôleur qui n'a pas été créé à cet effet. Un autre problème est que je n'arrive pas à faire fonctionner mon test d'intégration rspec, qui va essentiellement au root_path, remplit le formulaire avec un nouvel utilisateur, appuie sur le bouton et s'attend à un flash réussi ... mais le test obtient un document html vide en appuyant sur le bouton. Bien que cela fonctionne parfaitement bien quand je fais la même chose dans un navigateur.

Alors je me suis:

ne pourriez-vous mettre en quelque sorte ce qui précède, si la déclaration dans le fichier routes.rb et rediriger la requête vers le contrôleur et l'action respective?

Si oui, comment?

Ou est-ce que quelqu'un a une idée différente comment accomplir cela?

Merci,

-Konstantin

+0

En ce qui concerne votre problème RSpec, il peut être utile de poser une autre question avec plus de détails, par exemple: vos spécifications, plus de code, etc. –

Répondre

1

En fait, c'est une façon assez solide de traiter le problème.

Les routes dans Rails sont supposées être un moyen simple de mapper les URL au code. Une logique comme celle-ci appartient exactement à l'endroit où vous l'avez placé: dans le contrôleur.

+0

+1 @KonstantinK En passant, il n'est pas nécessaire d'écrire vos propres trucs d'aurhentication sauf si vous avez besoin de quelque chose de spécifique, consultez https://github.com/plataformatec/devise – Ant

+0

Eh bien, merci pour la réponse. Donc, le contrôleur de pages est vraiment le bon endroit ... Mais n'y at-il pas un moyen de ne pas avoir besoin de coller dans les autres codes de création? J'ai essayé de transmettre via redirect_to params.merge! : controller =>: sessions,: action =>: créer mais le problème est que puisque les mots de passe sont filtrés, ils ne sont pas transmis en tant que params. Je suppose que je devrais transmettre la demande entière et ne pas le rediriger – KonstantinK

1

répondre à ma propre question:

Transforme le problème de spécification était tout simplement en raison de Webrat ne suit pas dans les rails 3. réoriente Il est en fait un problème commun qui est résolu ->here par exemple.

Donc au moins ce problème est à l'écart.

Questions connexes