2012-12-11 67 views
1

我已閱讀了許多關於此的帖子,我仍然感到困惑。我對Rails比較陌生。我在Rails 3.2.8和Ruby 1.9.3上。嵌套的Rails窗體字段不呈現

我有一個表格,我想爲2個不同的表創建一個記錄。這是一個多對多的關係(日誌可以有多個飛機和飛機出現在多個日誌中)。

這裏是我的代碼:

# ----- Models ----- # 
class Logbook < ActiveRecord::Base 
    has_and_belongs_to_many :aircrafts 
    accepts_nested_attributes_for :aircrafts 
end 

class Aircraft < ActiveRecord::Base 
    belongs_to :logbook 
end 

# ----- Logbooks Controller ----- # 
def my_method 
    @logbook = Logbook.new 
    @aircraft = Aircraft.new 
end 

# ----- View ----- # 
<%= form_for @logbook, validate: true, remote: true do |f| %> 
    <%= f.label :flight_date, "Flight Date" %> 
    <%= f.text_field :flight_date %> 
    ... 

    <%= f.fields_for :aircrafts, validate: true, remote: true do |a| %> 
    <%= a.label :aircraft_id, "Aircraft ID" %> 
    <%= a.text_field :aircraft_id %> 
    ... 
    <% end %> 
<% end %> 

的日誌字段繪製精細,但飛機字段不渲染

任何想法?

回答

1

嘗試將控制器更改爲:

def my_method 
    @logbook = Logbook.new 
    @aircraft = @logbook.aircrafts.build 
end 

因爲@aircraft需要belongs_to一個日誌,所以nested_form將知道如何構建表單。

注:對飛機構成部分:如果你不使用變量@aircraft你不需要申報,只是對控制器

+0

OP,絕對使用像這裏展示的aircrafts.build,就像我所做的那樣,「Aircraft.new」。不知道爲什麼我沒有提到構建。我認爲我有一個大腦失誤。 – agmcleod

+0

感謝您的回覆。所以如果我像你指示的那樣調整我的控制器,這個'f.fields_for:飛機'是否需要改變爲'f.fields_for @ aircraft'? –

+0

不這樣,你可以在'fields_for'中指定'@ aircraft'作爲第二個參數,更多關於[ActionView :: Helpers :: FormHelper#fields_for](http://api.rubyonrails。組織/類/的ActionView /助手/ FormHelper.html#方法-I-fields_for) – daniloisr

0

如果我記得沒錯,fields_for將根據父對象存在的許多對象生成。由於您的@logbook沒有任何飛機,因此不會顯示任何字段。嘗試更改操作:

def my_method 
    @logbook = Logbook.new 
    @logbook.aircrafts << Aircraft.new 
end 

現在,如果您需要在UI中添加一些內容以添加多個日誌,則需要創建一個添加按鈕。你可以只增加你構建基於關閉該飛機的記錄量:

<%= form_tag new_logbook_path, :method => :get do %> 
    <%= hidden_field_tag "amount", @amount %> 
    <%= submit_tag "Add" %> 
<% end %> 

那麼行動將是:

def my_method 
    @amount = params[:amount] || 1 
    @logbook = Logbook.new 
    @amount.times { @logbook.aircrafts << Aircraft.new } 
end 
+0

使用@logbook.aircrafts.build我也將與「真正的遠程」建議慎用。由於整個表單將是一個基於聲明的遠程表單,當創建原始表單時它是遠程的,我不確定是否需要再次使用,並且我會嘗試查看它是否在沒有它的情況下工作。此外,這是一個小問題,但「飛機」在語法上不正確。當你和別人一起工作時,你的代碼應該是可讀的。 「飛機」會更好。 – adriandz

+0

是一個好點。有時最好刪除JS/ajax的東西,並確保它在沒有它的情況下運行,然後再追求好的UI。 – agmcleod

+0

感謝您的幫助。我選擇了「飛機」,因爲我的應用不限於飛機(也包括滑翔機,直升機,氣球等)。我反對的要求將所有事情都稱爲飛機,所以我就這樣做了。使用「飛機」困擾了我,但Rails想要一個複數詞。 :) –