Nested_form gem不能与Rails 4一起使用

时间:2013-08-21 16:30:59

标签: ruby-on-rails nested-forms

这是我的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

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

3 个答案:

答案 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)

希望这会有所帮助。