2012-03-04 3 views
0

nested_form을 사용하려고합니다. 아이 제거 작업 이외에도 모든 것이 잘 작동합니다. 그것은 추가/업데이트와 잘 작동합니다. 나는 컨트롤러 클래스를 변경하지 않았다.nested_form 레일즈 업데이트

은 이벤트에서 보이는 것처럼 보입니다. 프로젝트 컨트롤러에 숨겨진 값으로 모든 자식 정보를 보내고 모든 자식 요소를 자동으로 추가/업데이트합니다. 내가 뭘 놓치고 있니?

내 모델 : 프로젝트 & Workpackage는

class Project < ActiveRecord::Base 
    has_many :workpackages, :dependent => :destroy 
    accepts_nested_attributes_for :workpackages 
end 
class Workpackage < ActiveRecord::Base 
    belongs_to :project 
end 

보기 _form

<%= nested_form_for @project do |f| %> 
<% if @project.errors.any? %> 
<div id="error_explanation"> 
    <h2><%= pluralize(@project.errors.count, "error") %> prohibited this project from being saved:</h2> 
    <ul> 
     <% @project.errors.full_messages.each do |msg| %> 
     <li> 
      <%= msg %> 
     </li> 
     <% end %> 
    </ul> 
</div> 
<% end %> 
<div class="field"> 
    <%= f.label :name %> 
    <br /> 
    <%= f.text_field :name %> 
</div> 
<div class="field"> 
    <%= f.label :description %> 
    <br /> 
    <%= f.text_field :description %> 
</div> 
<div> 
    <%= f.fields_for :workpackages do |wp| %> 
    <div class="field"> 
     <%= wp.label :title %> 
     <br /> 
     <%= wp.text_field :title %> 
    </div> 
    <div class="field"> 
     <%= wp.label :wp_type %> 
     <br /> 
     <%= wp.text_field :wp_type %> 
    </div> 
    <%= wp.link_to_remove 'Remove' %> 
    <% end %> 
    <%= f.link_to_add 'Add new WorkPackage', :workpackages %> 
</div> 
<div class="actions"> 
    <%= f.submit %> 
</div> 
<% end %> 

내 모든 컨트롤러 클래스는 기본 골격으로 생성됩니다. EDIT 생성 된 nested_form Java 스크립트는 다음과 같습니다.

jQuery(function($) { 
    window.NestedFormEvents = function() { 
    this.addFields = $.proxy(this.addFields, this); 
    this.removeFields = $.proxy(this.removeFields, this); 
    }; 

    NestedFormEvents.prototype = { 
    addFields: function(e) { 
     // Setup 
     var link = e.currentTarget; 
     var assoc = $(link).attr('data-association');   // Name of child 
     var content = $('#' + assoc + '_fields_blueprint').html(); // Fields template 

     // Make the context correct by replacing new_<parents> with the generated ID 
     // of each of the parent objects 
     var context = ($(link).closest('.fields').find('input:first').attr('name') || '').replace(new RegExp('\[[a-z]+\]$'), ''); 

     // context will be something like this for a brand new form: 
     // project[tasks_attributes][new_1255929127459][assignments_attributes][new_1255929128105] 
     // or for an edit form: 
     // project[tasks_attributes][0][assignments_attributes][1] 
     if (context) { 
     var parentNames = context.match(/[a-z_]+_attributes/g) || []; 
     var parentIds = context.match(/(new_)?[0-9]+/g) || []; 

     for(var i = 0; i < parentNames.length; i++) { 
      if(parentIds[i]) { 
      content = content.replace(
       new RegExp('(_' + parentNames[i] + ')_.+?_', 'g'), 
       '$1_' + parentIds[i] + '_'); 

      content = content.replace(
       new RegExp('(\\[' + parentNames[i] + '\\])\\[.+?\\]', 'g'), 
       '$1[' + parentIds[i] + ']'); 
      } 
     } 
     } 

     // Make a unique ID for the new child 
     var regexp = new RegExp('new_' + assoc, 'g'); 
     var new_id = new Date().getTime(); 
     content  = content.replace(regexp, "new_" + new_id); 

     var field = this.insertFields(content, assoc, link); 
     $(link).closest("form") 
     .trigger({ type: 'nested:fieldAdded', field: field }) 
     .trigger({ type: 'nested:fieldAdded:' + assoc, field: field }); 
     return false; 
    }, 
    insertFields: function(content, assoc, link) { 
     return $(content).insertBefore(link); 
    }, 
    removeFields: function(e) { 
     var link = e.currentTarget; 
     var hiddenField = $(link).prev('input[type=hidden]'); 
     hiddenField.val(1); 
     // if (hiddenField) { 
     // $(link).v 
     // hiddenField.value = '1'; 
     // } 
     var field = $(link).closest('.fields'); 
     field.hide(); 
     $(link).closest("form").trigger({ type: 'nested:fieldRemoved', field: field }); 
     return false; 
    } 
    }; 

    window.nestedFormEvents = new NestedFormEvents(); 
    $('form a.add_nested_fields').live('click', nestedFormEvents.addFields); 
    $('form a.remove_nested_fields').live('click', nestedFormEvents.removeFields); 
}); 
+0

이 자바 스크립트/jQuery 코드를 볼 수 있습니다 추가했다 accepts_nested_attributes_for

참조 – Hishalv

+0

내가 생성 된 nested_form.js를 업데이트 –

답변

1

단지 해결책을 찾아 낼 수 있습니다. 내가 :allow_destroy => true

class Project < ActiveRecord::Base 
    has_many :workpackages, :dependent => :destroy 
    accepts_nested_attributes_for :workpackages, :allow_destroy => true 
end 
관련 문제