Rails - 使用form_for和fields_for,如何在fields_for块中访问子对象?

51
在我的第一个Rails应用程序中,我正在尝试使用form_forfields_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_numberobject.car.stall_number等等。没有任何进展。多次搜索和查看fields_for源代码都没有帮助我理解。我会感激任何指导。
更新:为了澄清,根据Dan的建议,我尝试了builder.stall_number,但结果是一个错误。
NoMethodError: undefined method 'stall_number' for #<ActionView::Helpers::FormBuilder:0x00000102a1baf0>
2个回答

87

今天我自己也刚刚处理了这个问题。

你可以通过以下方式访问fields_for的对象:

builder.object

builder是您的fields_for表单构建器对象。在您的特定情况下,您可以这样说:

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

那就对你有用了!


这个对象与关系的引用都已经断开了 @CharlieMezak - Marco Prins

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 中,您需要使用在那里定义的表单对象,即 builder。由于该数据未映射到外部表单 (f),而是映射到 cars 对象 (builder)。


对不起,丹,我应该提到“builder.stall_number”是我尝试的第一件事,但不幸的是,我使用它时出现了以下错误:NoMethodError-undefined method `stall_number' for #ActionView::Helpers::FormBuilder:0x00000102a1baf0。你有什么想法吗?谢谢! - Don Leatham
在您的控制器中,您构建汽车模型!然后您也需要引用它们。看看我发布的代码。对于每个车位,您需要拥有自己的子表单。@garage.stalls 引用了所有 5 个车位,因此 Ruby 不知道您想使用哪一个。 您可以尝试以下操作,使用您的代码并将 :cars 替换为 @garage.cars[1],并将 car.stall_number 更改为 builder.stall_number。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接