在我的rails应用中,我有两个模型,ClientPage
和ContentSection
,其中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
下实际上有第二个嵌套模型,如果没有相关模型,也会出现同样的问题。)
不确定我错过了什么相当明显的事情,但是我会非常感激任何指针或建议。
答案 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 %>