2010-03-20 4 views
6

Donc, je construis une application rails pour les lycéens et j'ai rencontré un problème quand il s'agit de créer des utilisateurs.Formulaires multiples sur la même page avec Rails

Je souhaite que les élèves puissent uniquement créer des comptes s'ils sélectionnent leur école et saisissent correctement le mot de passe de leur établissement.

Quelle est la façon correcte/la plus simple de le faire? Dois-je créer un gatekeeper à l'utilisateur # new action qu'ils doivent passer en premier ou si c'est de cette façon que sur la même page un étudiant peut soumettre à des formulaires. Serait le nom d'utilisateur, par courriel, mot de passe en utilisant:

form_for @user do 
    ... 
end 

Mais créant alors une autre forme pour la sélection de mots de passe haute école/haute école.

Idéalement, le contrôleur serait en mesure d'obtenir les paramètres de la forme de lycée, de les valider, puis de créer l'utilisateur à partir des paramètres de l'utilisateur.

Est-ce possible en utilisant des rails?

Ma configuration: Rails 3 et Ruby 1.9.2dev

Merci!

Répondre

9

Vous pouvez le faire avec fields_for (http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for)

Votre la vue ressemblera à quelque chose comme

form_for @user do |f| 
    fields_for @school do |school| 
    school.text_field  :name 
    school.password_field :password 
    end 

    f.text_field  :username 
    f.text_field  :email 
    f.password_field :password 
    f.submit "Submit" 
end 

Puis dans votre contrôleur, params [: user] Présenter les données de l'utilisateur, et params [: école] représentera le nom/mot de passe de l'école.

Vous pouvez ensuite valider le mot de passe correct avant de créer l'utilisateur.

+0

Je reçois une "méthode non définie' model_name 'pour NilClass: Class "avec cette implémentation. Des idées? –

+1

Avez-vous instancié un objet @school? Si vous ne souhaitez pas instancier un objet scolaire, vous pouvez remplacer la ligne fields_for par: "fields_for: school do | school |". – jrallison

+0

J'ai compris! Je vous remercie! –

0

Je ne suis pas familier avec Rails 3, mais cela fonctionnera certainement avec Rails 2. Une adaptation pourrait être nécessaire. Si vous fournissez votre modèle d'utilisateur, cela peut aider, mais je suppose que c'est quelque chose comme: un utilisateur appartient à l'école, et une école a un champ nommé mot de passe. Dans votre modèle d'utilisateur, vous pouvez avoir quelque chose comme:

validates_associated :school 
attr_accessible :school_password 

def validate_on_create 
    unless self.school_password == school.password 
    errors.add :school_password, "incorrect password, please try again" 
    end 
end 

Ensuite, vous pouvez avoir une boîte de sélection sous la forme, comme

form_for @user do |user| 
    user.select :school... 
    user.password_field :school_password 
end 
4

jrallison a raison sur fields_for, mais je suggère de considérer s'il est strictement nécessaire de faire les deux sur le même formulaire. Ce que vous décrivez avec le nom de l'école et le mot de passe ressemble beaucoup à l'authentification de l'utilisateur. Ce n'est peut-être pas un «utilisateur» au sens d'une seule personne, mais dans ce cas, «l'utilisateur» est l'école. Peut-être devriez-vous le traiter de la façon suivante: créez un formulaire de connexion distinct, créez une session en cas de succès (pour ne plus avoir à taper le mot de passe de votre établissement), et effectuez les messages flash standards ils échouent.

À ce stade, la forme dont vous avez besoin est simple et monotype. Et si d'autres fonctionnalités deviennent nécessaires plus tard que aussi besoin du mot de passe de l'école, vous avez déjà une longueur d'avance.

Questions connexes