2010-03-20 3 views
6

Also baue ich eine Rails-App für Gymnasiasten und ich habe ein Problem, wenn es darum geht, Benutzer zu erstellen.Mehrere Formulare auf der gleichen Seite mit Rails

Ich möchte, dass die Schüler nur Konten erstellen können, wenn sie ihre Schule auswählen und das Passwort ihrer Schule korrekt eingeben.

Was ist der richtige/einfachste Weg, dies zu tun? Soll ich dem Benutzer einen Gatekeeper anlegen # neue Aktion, die er zuerst durchlaufen muss oder wenn er eine Möglichkeit hat, die ein Student auf Formulare auf Formulare ablegen kann. Man wäre der regulären Benutzernamen, E-Mail, Passwort:

form_for @user do 
    ... 
end 

Aber dann eine andere Form für die Hochschule/High-School-Passwort Auswahl zu schaffen.

Idealerweise würde der Controller in der Lage sein, die Parameter des High-School-Formulars zu erhalten, diese zu validieren und dann den Benutzer aus den Benutzerparametern zu erstellen.

Ist dies mit Schienen möglich?

Mein Setup: Rails 3 und Ruby 1.9.2dev

Vielen Dank!

Antwort

9

du mit fields_for tun können (http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for)

Ihre Ansicht wird so etwas aussehen wie

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 

Dann in Ihrem Controller, params [: Benutzer] wird r Geben Sie die Benutzerdaten ein und params [: school] den Namen/das Passwort der Schule.

Sie können dann das korrekte Schulpasswort validieren, bevor Sie den Benutzer erstellen.

+0

Ich bekomme eine "undefinierte Methode' Modellname 'für NilClass: Class "Fehler mit dieser Implementierung. Irgendwelche Ideen? –

+1

Haben Sie ein @school-Objekt instanziiert? Wenn Sie ein Schulobjekt nicht instanziieren möchten, können Sie die Zeile fields_for in: "fields_for: school do | school |" ändern. – jrallison

+0

Verstanden! Vielen Dank! –

0

Ich bin nicht vertraut mit Rails 3, aber das wird sicherlich mit Rails 2 arbeiten. Einige Anpassung möglicherweise erforderlich.

Die Bereitstellung Ihres Benutzermodells würde helfen, aber ich nehme an, dass es etwas wie folgt ist: Ein Benutzer gehört zu einer Schule, und eine Schule hat ein Feld namens Passwort. In Ihrem User-Modell können Sie so etwas wie haben:

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 

Dann können Sie ein Auswahlfeld in der Form haben, wie

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

jrallison hat recht über fields_for, aber ich würde vorschlagen zu prüfen, ob es unbedingt notwendig ist, beide auf dem gleichen Formular zu tun.

Was Sie mit dem Namen und dem Passwort der Schule beschreiben, klingt ähnlich wie die Benutzerauthentifizierung. Es ist vielleicht kein "Benutzer" im Sinne einer einzelnen Person, aber in diesem Fall ist der "Benutzer" die Schule. Vielleicht sollten Sie es so behandeln: Haben Sie ein separates Login-Formular, erstellen Sie eine Sitzung, wenn sie erfolgreich ist (damit sie später nicht immer wieder das Passwort ihrer Schule eingeben müssen), und führen Sie die Standard-Flash-Nachrichten und dergleichen aus Sie versagen.

An diesem Punkt ist das Formular, das Sie benötigen, einfach und Einzelmodell. Und wenn später weitere Features notwendig werden, die auch das Schulpasswort benötigen, sind Sie schon einen Schritt voraus.