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);
});
이 자바 스크립트/jQuery 코드를 볼 수 있습니다 추가했다 accepts_nested_attributes_for
참조 – Hishalv
내가 생성 된 nested_form.js를 업데이트 –