【问题标题】:Rails - Using form_for and fields_for, how do you access the sub-object while in the fields_for block?Rails - 使用 form_for 和 fields_for,如何在 fields_for 块中访问子对象?
【发布时间】:2011-02-18 06:31:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    builder.object
    

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

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

    这应该会为你做的!

    【讨论】:

    • 这个对象对关系的引用都被破坏了@CharlieMezak
    【解决方案2】:

    您尝试的方式不起作用,因为您想访问 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),而是映射到汽车对象(builder)。

    【讨论】:

    • 对不起,丹,我应该提到“builder.stall_number”是我尝试的第一件事,但不幸的是,使用它我得到一个:NoMethodError - #。关于它可能意味着什么的任何想法?谢谢!
    • 在您的控制器中构建汽车模型!然后,您还需要引用它们。看我贴的代码。对于每个摊位,您需要有自己的子表格。 @garage.stalls 指的是所有 5 个摊位,因此 Ruby 不知道您要使用哪一个。您可以尝试以下操作,使用您的代码并将 :cars 替换为 @garage.cars[1] 并将 car.stall_number 更改为 builder.stall_number
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2013-01-12
    相关资源
    最近更新 更多