2016-05-31 45 views
0

我試圖創建與繭自稱是形式,問題的has_many問題,正在產生無限循環:(繭nested_form使自己

型號

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) 

回答

0

link_to_add_association也在服務器端預先呈現嵌套表單,因此當鏈接被點擊時,它可以插入「新」項目。

所以這就是你的無限循環來源於:該link_to_add_association呈現嵌套形式,這也使得該嵌套形式和link_to_add_association這也......循環往復;)

如果你真的想能夠建立一個無限的/無限的樹,繭不是你的工具。你將不得不訴諸使用阿賈克斯。

但是,如果您可以限制最大深度,那麼向視圖添加額外參數相當容易,只有當該級別低於最高級別時纔會呈現link_to_add_association

這已經拿出之前在繭中的問題和可能的解決方案是demonstrated

總之,假設最大深度爲5,你這樣做(HAML的可讀性):

= 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}} 
+0

非常感謝。 –

0

在你的問題領域,你必須:

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

這是造成循環。由於您在文件中,因此您一遍又一遍地調用此文件。

+0

呀,格雷厄姆,我會在但點擊時喜歡噸加載一個新的表格,創建一個樹,但它是你說的點擊之前,他稱之爲渲染,你知道我是如何解決?我應該創建一個JavaScript?謝謝 –