0

繭で自分自身を呼び出すフォームを作成しようとしています。質問には_多くの質問があり、無限ループが生成されています:(

モデル

class Question < ActiveRecord::Base
  has_many :questions,:foreign_key => "parent_id", :dependent =>:destroy
  belongs_to :basic_component

  attr_accessible :description, :questions_attributes, :questions

end

私の質問 _form

<%= semantic_form_for [:admin, @question] do |f| %>
  <%= f.inputs do %>
    <%= f.input :description %>
    <div class="questions">
      <%= f.semantic_fields_for :questions do |question| %>
          <%= render 'question_fields', :f => question %>
      <% end %>
      <div class="links">
        <%= link_to_add_association("Nova Pergunta", f, :questions, class: 'button') %>
      </div>
    </div>
  <% end %>
  <%= f.actions %>
<% end %>

私の_question_fields

<div class="nested-fields">
  <%= f.inputs do %>
    <%= f.input :description} %>
    <div class="questions">
      <%= f.semantic_fields_for :questions do |question| %>
        <%= render 'question_fields', :f => question %>
      <% end %>
      <div class="links">
        <%= link_to_add_association("Nova Pergunta", f, :questions, class: 'button') %>
      </div>
    </div>
  <% end %>
</div>

無限ループ:(、解決方法は?

  Rendered admin/questions/_question_fields.html.erb (168.4ms)
  Rendered admin/questions/_question_fields.html.erb (376.2ms)
  Rendered admin/questions/_question_fields.html.erb (586.4ms)
  Rendered admin/questions/_question_fields.html.erb (780.2ms)
4

2 に答える 2

0

質問フィールドには、次のものがあります。

<%= f.semantic_fields_for :questions do |question| %>
  <%= render 'question_fields', :f => question %>
<% end %>

これがループの原因です。ファイル内にいるため、このファイルを何度も呼び出しています。

于 2016-05-31T18:58:51.500 に答える
0

またlink_to_add_association、サーバー側でネストされたフォームを事前にレンダリングするため、リンクをクリックすると、「新しい」アイテムを挿入できます。

それがあなたの無限ループの由来です:link_to_add_associationネストされたフォームをレンダリングし、ネストされたフォームをレンダリングし、link_to_add_associationまた...無限に;)

無期限/無制限のツリーを本当に構築できるようにしたい場合は、cocoon は最適なツールではありません。ajax を使用する必要があります。

link_to_add_associationただし、最大深度を制限できる場合は、レベルが最大レベルを下回る場合にのみレンダリングする追加のパラメーターをビューに追加するのはかなり簡単です。

これは繭の問題で以前に出てきて、可能な解決策が実証されました

つまり、最大深度が 5 であると仮定すると、次のように (haml for readability) を実行します。

= semantic_form_for [:admin, @question] do |f| 
  = f.inputs do
    = f.input :description
      .questions
        = f.semantic_fields_for :questions do |question|
          = render 'question_fields', f: question, depth: 0
      .links
        = link_to_add_association "Nova Pergunta", f, :questions, 
             class: 'button', render_options: {locals: {depth: 0}}
  = f.actions

そして、question_fieldsパーシャルはこれをテストしますdepth(そしてそれを伝播します)

.nested-fields
  = f.inputs do
    = f.input :description
    .questions
      = f.semantic_fields_for :questions do |question| 
        = render 'question_fields', :f => question, depth: depth + 1
    - if depth < 5
      .links
        = link_to_add_association "Nova Pergunta", f, :questions, 
          class: 'button', render_options: {locals: {depth: depth + 1}}
于 2016-06-01T13:43:51.410 に答える