2010-03-20 14 views
6

Estoy construyendo una aplicación de rieles para estudiantes de secundaria y me he topado con un problema cuando se trata de crear usuarios.Múltiples formularios en la misma página con rieles

Quiero que los estudiantes solo puedan crear cuentas si seleccionan su escuela y escriben la contraseña de su escuela correctamente.

¿Cuál es la forma correcta/más fácil de hacer esto? ¿Debo crear un portero para el usuario? Nueva acción que tienen que pasar primero o si es una forma en que en la misma página un alumno puede enviar formularios. Uno sería el nombre de usuario regular, correo electrónico, contraseña usando:

form_for @user do 
    ... 
end 

Pero luego la creación de otra forma para el/la selección de contraseñas de instituto de secundaria.

Idealmente, el controlador sería capaz de obtener los parámetros de la forma de la escuela secundaria, validarlos y luego crear el usuario a partir de los parámetros del usuario.

¿Es posible utilizar los rieles?

mi configuración: Carriles 3 y Rubí 1.9.2dev

Gracias!

Respuesta

9

Usted puede hacer esto con fields_for (http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for)

Su la vista se verá algo así como

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 

Luego en su controlador, params [: user] will r epresente los datos del usuario, y params [: school] representará el nombre/contraseña de la escuela.

Puede validar la contraseña de la escuela correcta antes de crear al usuario.

+0

Obtengo un "método indefinido' model_name 'for NilClass: Class "error con esta implementación. ¿Algunas ideas? –

+1

¿Instanciaste un objeto @school? Si no quiere crear una instancia de un objeto escolar, puede cambiar la línea fields_for por: "fields_for: school do | school |". – jrallison

+0

¡Entendido! ¡Gracias! –

0

No estoy familiarizado con Rails 3, pero esto ciertamente funcionará con Rails 2. Puede ser necesaria alguna adaptación.

Proporcionar su modelo de usuario ayudaría, pero supongo que es algo así como: un usuario pertenece a: escuela, y una escuela tiene un campo llamado contraseña. En su modelo de usuario que puede tener algo como:

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 

, entonces puede tener un cuadro de selección en la forma, como

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

jrallison tiene razón acerca de fields_for, pero sugiero considerar si es estrictamente necesario hacer ambas cosas en el mismo formulario.

Lo que está describiendo con el nombre de la escuela y la contraseña se parece mucho a la autenticación de usuario. Puede que no sea un "usuario" en el sentido de una sola persona, pero en este caso el "usuario" es la escuela. Tal vez debería tratarlo de esa manera: tener un formulario de inicio de sesión por separado, crear una sesión si tienen éxito (para que no tengan que escribir la contraseña de su escuela una y otra vez más adelante), y hacer los mensajes flash estándar y si Ellos fallan.

En ese momento, el formulario que necesita es simple y de un solo modelo. Y si otras funciones se vuelven necesarias más adelante en ese también necesita la contraseña de la escuela, ya está un paso por delante.

Cuestiones relacionadas