2013-08-21 3 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

undefined method 'addresses ' –

+2

Это' has_one', поэтому я считаю, что это просто 'адрес'. – MurifoX

0

В вашем CompetitionController использовать конструктор как здесь:

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 
Смежные вопросы