2011-01-26 27 views
63

Tengo un modelo, y tengo una vista que muestra un formulario para crear un nuevo objeto basado en ese modelo. Llamemos a ese formulario, Form1.Rieles 3/Forma sin modelo: ¿Cómo creo un formulario que no está vinculado a un modelo?

Una vez que el usuario envía Form1, se crea el objeto. Luego quiero mostrar, en la página siguiente, un segundo formulario Form2, que solicita al usuario que marque varias opciones antes de guardar el objeto en la base de datos.

Mi problema es probablemente extremadamente básico. No sé cómo crear Form2, dado que no está vinculado directamente al modelo. Porque yo soy muy novato Rails, sólo he creado como formas siguientes:

form_for(@object) { |f| ... } 

@object es un objeto instanciado a partir del modelo

Problema: No creo que ese tipo de código funcionará para mis propósitos aquí. ¿Cómo creo Form2, dado que no debe basarse en el modelo @object o @object?

Algunos detalles de mi aplicación:

el sitio acepta valores (Form1) antes de volver a dirigir a un servidor OAuth.

Cuando el usuario verifica sus credenciales en el servidor OAuth, se le redirige a mi sitio. Una solicitud XML-RPC luego recupera información sobre la cuenta del usuario en el servidor OAuth.

La respuesta XML puede indicar que el usuario tiene una sola cuenta en el servidor OAuth. Si es así, algunos valores se recuperan del XML y se agregan al objeto, que luego se guarda (finalmente) en la base de datos, y el usuario se redirige a una página de éxito.

Sin embargo, si la respuesta XML indica que el usuario tiene varias cuentas en el servidor OAuth, quiero mostrar un formulario (Form2) que permite al usuario seleccionar qué cuentas en el servidor de OAuth para asociar con mi sitio. Entonces, Form2 realmente le pregunta al usuario cuántos objetos crear, en lugar de atributos específicos de un objeto.

+2

Use form_tag u otros ayudantes de formulario – apneadiving

+0

Ya resuelto en: http://stackoverflow.com/q/804313/428813, consulte el útil comentario de Sarah –

Respuesta

114

Uso form_tag en lugar de form_for, a continuación, utilizar los helpers de formularios apropiados: text_field_tag en lugar de f.text_field, text_area_tag en lugar de f.text_area, etc.Ejemplo:

<%= form_tag "/my_controller/update2" do %> 
    <%= text_field_tag "account", "default info" %> 
    <%= submit_tag "Save" %> 
<% end %> 

El sitio del API de Rails tiene una gran referencia a todos los ayudantes funciones acabadas en _tag: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

35

A partir de rails3, validaciones se han desacoplado de ActiveRecord para que pueda crear objetos de vainilla que se pueden utilizar como validadores con el formulario de ayudantes:

class Person 
    include ActiveModel::Validations 

    attr_accessor :first_name, :last_name 

    validates_each :first_name, :last_name do |record, attr, value| 
    record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z 
    end 
end 

y luego en su plantilla:

<%= form_for(Person.new) do |f| %> 
... 

Es una forma útil de obtener los beneficios de los ayudantes de formulario para cosas como formularios de correo electrónico sin tener que crear un objeto modelo vinculado a su esquema.

4

Para crear un modelo sin tablas,

class Person 
    include ActiveModel::Model 

    attr_accessor :first_name, :last_name 

    validates :first_name, :last_name, presence: true 
end 

Luego, en su opinión,

<%= form_for(Person.new) do |f| %> 
.... your form .... 
<% end %> 

Otra solución similar se puede encontrar en RailsCasts: Active-Model

+0

Gracias, [kleopatra] (http://stackoverflow.com/users/203657/kleopatra) por sus comentarios sobre esto. He editado en consecuencia. – Lahiru

+0

Uno tiene que [incluir ActiveModel :: Conversion] (http://stackoverflow.com/a/37822674/673826) también y definir 'persisted?' Como falso. – mlt

Cuestiones relacionadas