4

私の Rails アプリには、 aClientPageと aの 2 つのモデルがありContentSection、ここでClientPage has_many :content_sections. nested_form両方のモデルに宝石を使用して、同じフォームで編集しています。ClientPageこれは、 に少なくとも 1 つの がある限り正常に機能しますContentSectionが、関連する がない場合ClientSections、usingnested_formlink_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 %>

ページに少なくとも 1 つClientSection関連付けられている限り、これは正常に機能します。存在しないとすぐに、エラーがスローされます。を削除link_to_addすると、エラーがスローされなくなります。(実際には の下ContentSectionに 2 番目のネストされたモデルがあり、関連付けられたモデルがない場合も同じ問題が発生します。)

私が見逃していることは明らかですが、指針や提案は大歓迎です。

4

1 に答える 1

6

最後にこれを解決しました-エラーは、私が宝石を少し非標準的な方法で使用していたという事実によるものでした. フォーム内で、すべてのコンテンツ セクションを標準的な方法でレンダリングする代わりに、次のようにします。

<%= 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、関連付けが空であっても get が呼び出されるようにすることでした。

<% if page.content_sections.empty? %>
  <%= f.fields_for :content_sections do |section_form| %>
    # section fields
  <% end %>
<% end %>
于 2013-07-15T01:08:31.137 に答える