2011-02-18 56 views
44

在我的第一個rails應用程序中,我試圖使用form_forfields_for創建一個嵌套對象窗體。到目前爲止這麼好,但我不知道如何在fields_for塊中訪問子對象。我已經在子對象中預填充了一個字段,其中包含要顯示在用戶說明中的數據。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 %> 

正如你所看到的,對於建設者塊中:汽車,我想表明,我的用戶指令,場:car.stall_number(已在我的控制器一個整數):

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

我已經嘗試了許多不同的想法:@car.stall_numberobject.car.stall_number等,沒有喜悅。多次搜索和查看fields_for源代碼並沒有幫助我理解。我將不勝感激任何指導。

更新:爲了清楚起見,每丹的建議,我已經試過builder.stall_number但它會導致

NoMethodError: undefined method 'stall_number' for #<ActionView::Helpers::FormBuilder:0x00000102a1baf0> 

回答

77

我今天就自己處理了這個問題。其中建設者是你的fields_for表單生成對象

builder.object 

您可以通過訪問fields_for的對象。在你的具體情況下,你可以說:

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

這應該爲你做!

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),而是映射到汽車對象(構建器)。

+0

對不起丹,我應該提到,「建設者。「stall_number」是我第一次嘗試,但不幸使用它我得到: NoMethodError - 未定義的方法`stall_number'爲#。 任何想法它可能意味着什麼?謝謝! – 2011-02-18 07:18:20

+0

在你的控制器中你建立了汽車模型!然後你也需要參考他們。看看我發佈的代碼。對於每個攤位你需要有你自己的子窗體@ garage.stalls指的是所有5個攤位,因此Ruby不知道你想使用哪一個 您可以嘗試以下操作,使用您的代碼並替換:帶有@ garage.cars [1]的汽車,並將car.stall_number更改爲builder.stall_number – Dan 2011-02-18 09:59:27