ruby on rails 3 - select_tag - Rieles: al usar form_for y fields_for, ¿cómo se accede al subobjeto mientras se está en fields_for block?
nested form rails (2)
En mi primera aplicación de rieles, intento 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 mientras fields_for
en el campo fields_for
block. He rellenado previamente un campo en el subobjeto con los datos que quiero mostrar en las instrucciones del usuario.
Modelos
Garaje:
has_many :cars, :dependent => :destroy
accepts_nested_attributes_for :cars
Coche:
belongs_to :garage
Controlador de garaje
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 puede ver, dentro del bloque de construcción para: autos, quiero mostrar, en mis instrucciones de usuario, el campo: car.stall_number
(poblado en mi controlador con un número entero):
<p>Enter license for car parked in stall: <%= car.stall_number%></p>
He intentado muchas ideas diferentes: @car.stall_number
, object.car.stall_number
, etc. No hay alegría. Múltiples búsquedas y un vistazo a los fields_for
código fuente no han ayudado a mi comprensión. Agradecería cualquier orientación.
Actualización: para aclarar, según la sugerencia de Dan, probé builder.stall_number
pero da como resultado un
NoMethodError: undefined method ''stall_number'' for #<ActionView::Helpers::FormBuilder:0x00000102a1baf0>
Acabo de lidiar con esto hoy mismo.
Puede acceder al objeto de los campos_por:
builder.object
donde el constructor es tu objeto fields_for form builder. En su caso particular, puede decir:
<p>Enter license for car parked in stall: <%= builder.object.stall_number%></p>
Eso debería hacerlo por ti!
La forma en que está intentando no funciona porque quiere acceder al car
sin llenar esa variable para los datos.
Supongo que quiere tener varios bloques de puestos, donde puede ingresar matrículas. Para cada puesto necesitarás tus propios fields_for
. 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 de los campos_para que necesite usar 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).