使用带有空关联的nested_form gem时出错

时间:2013-07-12 07:18:35

标签: ruby-on-rails-3 nested-forms

在我的rails应用中,我有两个模型,ClientPageContentSection,其中ClientPage has_many :content_sections。我正在使用nested_form gem来使用相同的表单编辑两个模型。只要ClientPage至少有一个ContentSection,这项工作正常,但如果没有关联ClientSections,则使用nested_form的{​​{1}}方法会抛出以下link_to_add

NoMethodError

表格结构如下:

undefined method `values_at' for nil:NilClass

只要至少有一个<%= nested_form_for page, form_options do |f| %> # ClientPage fields # ClientSections <%= f.link_to_add "Add new section", :content_sections %> <% end %> 与页面关联,这就可以了。一旦没有,就会抛出错误。删除ClientSection也会停止抛出错误。 (link_to_add下实际上有第二个嵌套模型,如果没有相关模型,也会出现同样的问题。)

不确定我错过了什么相当明显的事情,但是我会非常感激任何指针或建议。

1 个答案:

答案 0 :(得分:6)

最后解决了这个错误 - 错误是由于我以略微非标准的方式使用gem。在表单中,而不是以标准方式呈现所有内容部分:

<%= f.fields_for :content_sections do |section_form| %>
  # section fields
<% end %>

我把它放在循环中,因为我需要每个项目的索引(它没有存储在模型本身中):

<% page.content_sections.each_with_index do |section, index| %>
  <%= f.fields_for :content_sections, section do |section_form| %>
    # section fields
  <% end %>
<% end %>

以这种方式执行此操作的问题是,如果关联为空,则不会调用fields_for方法,因此gem无法构建对象的蓝图(用于添加额外项目)调用link_to_add时。

解决方案是确保即使关联为空也会调用fields_for

<% if page.content_sections.empty? %>
  <%= f.fields_for :content_sections do |section_form| %>
    # section fields
  <% end %>
<% end %>