이중 중첩?
7566 단어 nested_form
묘사
여보세요,나는 다음과 같은'여행'모델을 가지고 있다.
Class Trip < ActiveRecord::Base
belongs_to :return_trip, :class_name=> "Trip", :foreign_key => "return_trip_id"
has_many :stops
accepts_nested_attributes_for :return_trip
accepts_nested_attributes_for :stops, :allow_destroy => true
내 테이블로:nested_form_for @trip do |f|
f.fields_for :stops do |stop_form|
...
end
f.fields_for :return_trip do |return_from|
return_form.fields_for :stops do |return_stops_form|
....
end
end
end
모든 작업이 정상적이지만, 되돌아오는 역은 원래 @trip와 연결되며, 되돌아오는 스위치와 연결되지 않습니다.나는 내가 시도한 것이 실현될 수 있을지 모르겠다.
감사
토론 #1
현재 중첩된 표는 같은 이름의 여러 연결을 정확하게 처리할 수 없습니다.이것은 내부에 관련 이름stops
을 기반으로 템플릿을 만들었기 때문에, 여기에 두 개의 같은 이름의 템플릿이 있기 때문에, 첫 번째 return_trip
아래에 끼워 넣지 않음) 을 선택합니다.불행히도, 나는 지금 간단한 해결 방법을 생각해 내지 못하지만, 나는 그것을 복구라고 표시할 것이다.또한 complex-form-examples와 같이 수동으로 이 작업을 수행해야 할 수도 있습니다.
토론 #2
나도 같은 문제에 부딪혀 결국 끼워 넣은 표를 침입했다.js는 이 템플릿에 따라 삽입 필드의 이름 속성을 변경합니다(DOM에서).나는 이미 나에게 적합한 해결 방안을 찾았고 효과가 매우 좋은 것 같다. (나는 20층까지 끼워 넣으려고 한다.!!!)이것은 내 패치입니다:
jQuery(function($) {
$('form a.add_nested_fields').live('click', function() {
// Setup
var assoc = $(this).attr('data-association'); // Name of child
var content = $('#' + assoc + '_fields_blueprint').html(); // Fields template
// 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);
$(this).before(content);
var model_attribute_name, parent_name, new_name;
// Change name attributes of inserted fields to be correct in deep nesting
var new_fields = $("[id*='"+new_id+"'][name]");
new_fields.each( function(index, field) {
// Name of the attribute (ie: title) which is represented by an input
model_attribute_name = $(field).attr("name").match(/\[(\w*)\]$/)[0];
// Name of parent field in the tree (ie: if we're displaying a project's tasks, then the name is related to "project")
parent_name = $(field).closest(".fields").parents(".fields").find("input").first().attr("name");
// Use parent's field name (in nesting) to generate child field's name
new_name = parent_name.replace(/\[\w*\]$/, "["+assoc+"_attributes][new_"+new_id+"]"+model_attribute_name); // Correct name
// Change it in the DOM
$(field).attr("name",new_name);
});
$(this).closest("form").trigger('nested:fieldAdded');
return false;
});
$('form a.remove_nested_fields').live('click', function() {
var hidden_field = $(this).prev('input[type=hidden]')[0];
if(hidden_field) {
hidden_field.value = '1';
}
$(this).closest('.fields').hide();
$(this).closest("form").trigger('nested:fieldRemoved');
return false;
});
});
도움이 되었으면 좋겠습니다.토론 #셋
저는 차원 트리 모델 구조에서도 같은 문제에 부딪혔습니다.# 고마워요. - 패치가 저한테 너무 좋아요!
우리 마스터로 합병해도 돼요?
토론 #4
이 패치도 저한테 어울려요.+1 합병에 사용
토론 #5
여보세요,parent name이 정의되지 않았을 때 (우리가 한 단계 끼워 넣었기 때문일 수도 있고, 끼워 넣은 필드에class.field가 없기 때문일 수도 있습니다.) 효과가 없을 수도 있습니다.다음은 새 패치(parent name 및 올바른 필드 이름 지정을 테스트하는 데 방금 추가된 테스트)입니다.
jQuery(function($) {
$('form a.add_nested_fields').live('click', function() {
// Setup
var assoc = $(this).attr('data-association'); // Name of child
var content = $('#' + assoc + '_fields_blueprint').html(); // Fields template
// 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);
$(this).before(content);
// corrige_new_fields(new_id);
var model_attribute_name, parent_name, new_name;
// Change name attributes of inserted fields to be correct in deep nesting
var new_fields = $("[name*='"+new_id+"']");
new_fields.each( function(index, field) {
// Name of the attribute (ie: title) which is represented by an input
model_attribute_name = $(field).attr("name").match(/\[(\w*)\]$/)[0];
// Name of parent field in the tree (ie: if we're displaying a project's tasks, then the name is related to "project")
parent_name = $(field).closest(".fields").parents(".fields").find("input").first().attr("name");
// Use parent's field name (in nesting) to generate child field's name
//
if( parent_name == undefined ) {
parent_name = $(field).attr("name").replace(/\[\w*\]$/, '');
// Use parent's field name (in nesting) to generate child field's name
new_name = parent_name.replace(/\[\w*\]$/, "[new_"+new_id+"]"+model_attribute_name); // Correct name
} else {
new_name = parent_name.replace(/\[\w*\]$/, "["+assoc+"_attributes][new_"+new_id+"]"+model_attribute_name); // Correct name
}
// Change it in the DOM
$(field).attr("name",new_name);
});
// console.log(new_fields.closest("input"));
$(this).closest("form").trigger('nested:fieldAdded', [assoc, new_fields.closest("input")]);
return false;
});
$('form a.remove_nested_fields').live('click', function() {
var hidden_field = $(this).prev('input[type=hidden]')[0];
if(hidden_field) {
hidden_field.value = '1';
}
$(this).closest('.fields').hide();
$(this).closest("form").trigger('nested:fieldRemoved');
return false;
});
});
토론 #6
이 패치는 작동할 수 있지만 현재 js가 성공한 몇몇 깊은 패치 실례에서 그것은 나에게 실패했다.누가 현재 코드로 코드를 업데이트한 적이 있습니까?만약 없다면, 나는 이 문제를 해결하기 위해 노력하고, 요청을 제출할 것이다.토론 #7
나도 비교적 깊이 박힌 표에서 이 오류를 만났다.나는 this code처럼 그것을 해결하려고 한다이것은 나에게 매우 효과가 있지만, 나는 패치와 테스트를 할 시간이 없다.나의 변체를 시험해 보아라, 그것이 너에게 적합한지 아닌지를 알게.
토론 #8
유효하면 이 패치로pull 요청을 만들 것입니다.토론 #9
실제로, 나는 jquery nested 표의 16줄을 바꾸어 현재 js를 작업시켰다. (부분적으로 같은 이름을 포함하는 이중 삽입 대상에 대해)js$(link).closest('.fields').find('input:first')
대상$(link).closest('.fields').find('input').first()
해보고 싶어요.토론 #10
응. 내 문제는 내가 모델에 대해 서로 다른 연관이 있을 때 스크립트가 심층 형식의 필드 이름을 정확하게 처리하지 못한다는 것이다.하지만 나는 너의 변종을 시도해 보았고, 너에게 결과를 알려주었다.토론 #11
는 버전 0.2.2를 발표했다.한번 해볼래요?토론 #12
이 문제는 276143B26EA45765722F54439FE014E3364A63C와 74a8683c1e2569f575f828b7f9dd84957a47ee67에서 해결되었다.Reference
이 문제에 관하여(이중 중첩?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/ryanb/nested_form/issues/45텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)