2011-02-18 19 views
44

En mi primera aplicación de rieles estoy tratando de usar form_for y fields_for para crear un formulario de objeto anidado. Hasta aquí todo bien, pero no puedo entender cómo acceder al subobjeto en el bloque fields_for. He rellenado previamente un campo en el subobjeto con los datos que quiero mostrar en las instrucciones del usuario.Rieles: al usar form_for y fields_for, ¿cómo se accede al subobjeto mientras se está en fields_for block?

Modelos
Garaje:

has_many :cars, :dependent => :destroy   
accepts_nested_attributes_for :cars 

Coche:

belongs_to :garage 

Garaje controlador

def new 
    @garage = Garage.new 
    for i in 1..5 
    @garage.cars.build :stall_number => i 
    end 
end 

_form.html.erb

<%= form_for @garage do |f| %> 
    <%= f.label :title, "Garage Name" %><br /> 
    <%= f.text_field :title %> 
    <% f.fields_for :cars do |builder| %> 
    <p>Enter license for car parked in stall: <%= car.stall_number %></p> 
    <%= f.label :license, "License #:" %><br /> 
    <%= f.text_field :license %> 
    <%= end %> 
<%= end %> 

Como se puede ver, en el interior del bloque constructor para: coches, quiero mostrar, en mis instrucciones para el usuario, el campo: car.stall_number (ocupado en mi controlador con un entero):

<p>Enter license for car parked in stall: <%= car.stall_number%></p> 

he probado muchas ideas diferentes: @car.stall_number, object.car.stall_number, etc. No hay alegría. Varias búsquedas y un vistazo al código fuente fields_for no han ayudado a mi comprensión. Agradecería cualquier orientación.

Actualización: Para mayor claridad, por sugerencia de Dan he tratado builder.stall_number pero resulta en una

NoMethodError: undefined method 'stall_number' for #<ActionView::Helpers::FormBuilder:0x00000102a1baf0> 

Respuesta

77

Acabo de resolver esto hoy mismo.

Se puede acceder al objeto de la fields_for través de:

builder.object 

donde constructor es su fields_for objeto constructor de la forma. En su caso particular, puede decir:

<p>Enter license for car parked in stall: <%= builder.object.stall_number%></p> 

¡Eso debería hacerlo por usted!

+0

Referencia de este objeto a las relaciones están todas rotas @CharlieMezak –

+0

¡Esto funcionó para mí! –

3

La forma en que está tratando es no funciona debido a que desea acceder car sin llenar esa variable para datos.

Supongo que quiere tener varios bloques de puestos, donde puede ingresar matrículas. Para cada puesto necesitarás tu propio fields_for. Yo sugeriría algo así:

<%= form_for @garage do |f| %> 
    <%= f.label :title, "Garage Name" %><br /> 
    <%= f.text_field :title %> 

    <% for i in 1..5 %> 
    <% f.fields_for @garage.cars[i] do |builder| %> 
     <p>Enter license for car parked in stall: <%= builder.stall_number%></p> 
     <%= builder.label :license, "License #:" %><br /> 
     <%= builder.text_field :license %> 
    <% end %> 
    <% end %> 
<% end %> 

Dentro del fields_for es necesario utilizar el objeto de formulario que defina allí, en este caso constructor. Dado que los datos no están mapeados a la forma externa (f), sino al objeto del automóvil (constructor).

+0

Lo siento Dan, debería haber mencionado que "constructor.stall_number", fue lo primero que he intentado, pero desafortunadamente usarlo consigo una: NoMethodError - método no definido' stall_number' para # Alguna idea sobre lo que podría significar. ? Gracias! –

+0

En su controlador, usted construye los modelos de automóviles. Luego, debe hacer referencia a ellos también. Mire el código que publiqué. Para cada puesto, debe tener su propia forma secundaria. @ Garage.stalls se refiere a los 5 puestos, por lo tanto, Ruby no sabe cuál quieres usar. Puedes intentar lo siguiente, usar tu código y sustituir: cars con @ garage.cars [1] y cambiar car.stall_number por builder.stall_number – Dan

Cuestiones relacionadas