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

时间:2011-02-18 06:31:58

标签: ruby-on-rails-3 forms nested-forms

在我的第一个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 个答案:

答案 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),而是映射到汽车对象(构建器)。