이중 중첩?

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에서 해결되었다.

좋은 웹페이지 즐겨찾기