2013-08-21 59 views
0

工作這是我nested_form:Nested_form寶石不使用Rails 4

.. 
... 
54 <div> 
55  <h2> Address </h2> 
56  <%= f.fields_for :address do |address_form| %> 
57  <%= address_form.text_field :country %> 
58  <% end %> 
59 </div> 
60 
61 <div> 
62  <h2> Participants </h2> 
63  <%= f.fields_for :participants do |participant_form| %> 
64  <%= participant_form.text_field :name %> 
65  <%= participant_form.link_to_remove "Remove this participant" %> 
66  <% end %> 
67  <p><%= f.link_to_add "Add a participant", :participants %></p> 
68 </div> 
... 
.. 

現在,當我訪問我的模型/新頁面不渲染的地址或參與任何領域。

這是我的模型:

1 class CompetitionEntry < ActiveRecord::Base 
    2 has_many :participants 
    3 has_one :address 
    4 has_many :music_programs 
    5 
    6 accepts_nested_attributes_for :address 
    7 
    8 accepts_nested_attributes_for :participants, :music_programs, 
    9  :allow_destroy => true, 
10  :reject_if  => :all_blank 
11 end 

這是我的控制器:

16 def new 
17  @competition_entry = CompetitionEntry.new 
18 end 

爲什麼會發生?我錯過了什麼?

+0

難道是它試圖渲染的,在一個新的記錄,也有現有的參與者沒有? – lime

回答

1

那麼,你必須使用build方法實例化空白嵌套對象,所以視圖可以呈現一些東西。

def new 
    @competition_entry = CompetitionEntry.new 
    @competition_entry.address.build 
    @competition_entry.participants.build 
end 

你甚至可以使用循環來創建多個關聯的對象。像3.times {@competition_entry.participants.build}

+0

未定義的方法'地址' –

+2

它是'has_one',所以我相信它只是'地址'。 – MurifoX

0

進入你的CompetitionController使用Builder喜歡這裏:

def new 
    @competition_entry = CompetitionEntry.new 
    @competition_entry.build_address 
    @competition_entry.participants.build 
    @competition_entry.music_programs.build 
end 

此外,製造商可能不知道你想從嵌套形式傳輸到控制器的屬性。

把這個放入你的控制器。

def competition_entry_params 

    params.require(:competition_entry).permit(<<competition_entry_attributes>>, address_attributes: [:country], participants_attributes: [:name], music_programs_attributes: [:something, :something_else]) 

end 

然後用這個爲行動創建和/或更新

@competition_entry = CompetitionEntry.new(competition_entry_params) 

希望這會有所幫助。

1

如果其has_one關係,然後創建正確的方法是不

@competition_entry.address.build 

@competition_entry.build_address