这是我的nested_form:
..
...
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 :(得分:1)
好吧,你必须使用build
方法来实例化空白嵌套对象,这样视图就可以渲染一些东西。
def new
@competition_entry = CompetitionEntry.new
@competition_entry.address.build
@competition_entry.participants.build
end
您甚至可以使用循环来创建多个关联对象。与3.times {@competition_entry.participants.build}
一样。
答案 1 :(得分:1)
如果它的has_one
关系,则正确的创建方式不是
@competition_entry.address.build
它是
@competition_entry.build_address
答案 2 :(得分: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)
希望这会有所帮助。