0

这是我的嵌套表格:

..
...
 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

为什么会这样?我错过了什么?

4

3 回答 3

1

如果它的has_one关系那么正确的创建方式不是

 @competition_entry.address.build

这是

 @competition_entry.build_address
于 2014-03-12T01:16:13.220 回答
1

好吧,您必须使用该build方法来实例化空白嵌套对象,以便视图可以呈现一些东西。

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

您甚至可以使用循环来创建多个关联对象。喜欢3.times {@competition_entry.participants.build}

于 2013-08-21T16:48:33.490 回答
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)

希望这会有所帮助。

于 2014-01-06T10:33:40.160 回答