在我的第一个rails应用程序中,我正在尝试使用form_for
和fields_for
来创建嵌套对象表单。到目前为止一直很好,但我无法弄清楚如何在fields_for
块中访问子对象。我已经在子对象中预先填充了一个字段,其中包含我想要在用户说明中显示的数据。
模型
车库:
has_many :cars, :dependent => :destroy
accepts_nested_attributes_for :cars
汽车:
belongs_to :garage
车库控制器
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 %>
正如您所看到的,在构建器块中为:cars,我想在我的用户指令中显示字段:car.stall_number
(在我的控制器中填充整数):
<p>Enter license for car parked in stall: <%= car.stall_number%></p>
我尝试过很多不同的想法:@car.stall_number
,object.car.stall_number
等等。没有快乐。多次搜索并查看fields_for
源代码并没有帮助我理解。我很感激任何指导。
更新:为了澄清,根据Dan的建议,我尝试了builder.stall_number
,但结果是
NoMethodError: undefined method 'stall_number' for #<ActionView::Helpers::FormBuilder:0x00000102a1baf0>
答案 0 :(得分:79)
我今天刚刚处理了这个问题。
您可以通过以下方式访问fields_for的对象:
builder.object
其中builder是您的fields_for表单构建器对象。在您的特定情况下,您可以说:
<p>Enter license for car parked in stall: <%= builder.object.stall_number%></p>
那应该为你做到的!
答案 1 :(得分:3)
您尝试的方式无效,因为您希望在不填写数据变量的情况下访问car
。
我想你想要有多个摊位,你可以在那里输入车牌。对于每个摊位,您将需要自己的fields_for
。
我会建议这样的事情:
<%= 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 %>
在fields_for中,您需要使用您在此处定义的表单对象,在本例中为构建器。由于数据没有映射到外部形式(f),而是映射到汽车对象(构建器)。