2014-05-10 2 views
0

중첩 된 특성이 새 탭에서 생성 된 양식을 만들려고합니다. 중첩 된 특성을 받아 들일 수 있도록 내 모델을 설정했습니다. 그러나 양식을 제출할 때 텍스트 필드에 설정된 모든 값이 공백으로 전달되지만 컨트롤러는 중첩 된 필드를 모델에 전달합니다.중첩 필드 텍스트 필드 값이 컨트롤러에서 컨트롤러로 전달되지 않습니다. 3.2

Parameters: {"utf8"=>"✓", "authenticity_token"=>"x", "group"=>{"pilgrims_attributes"=>{"1399738268141"=>{"surname"=>"", "name"=>"", "middle"=>"", "aka"=>"", "prefix"=>"", "suffix"=>"", "nationality"=>"", "passport_number"=>"", "expiration(2i)"=>"5", "expiration(3i)"=>"10", "expiration(1i)"=>"2014", "date_of_birth(2i)"=>"5", "date_of_birth(3i)"=>"10", "date_of_birth(1i)"=>"2014", "accommodation"=>"", "roommate_id"=>"", "flight"=>"", "seat_id"=>"", "special_diet"=>"", "status"=>"Pilgrim"}}, "email"=>"", "telephone"=>"", "secondary_telephone"=>"", "address"=>"", "country_code"=>"", "state_code"=>"", "city"=>"", "zip"=>""}, "commit"=>"Create Group", "trip_id"=>"1"} 

그래서 그것은 필드를 제출하는 데 필요한 따기 보인다, 그것은 제대로 date_selects에 기본값을 전달 있어요 그러나 나는 텍스트 필드에 입력 한 값은 단지 비어 있습니다.

그래서 현재 fields_for 블록을 사용하고 있지 않지만 컨트롤러에 전달되는 항목이 있기 때문에 필요하지 않은 것처럼 보입니다. fields_for 블록을 사용해야 할 경우 HTML 마크 업에 어디에 배치해야합니까?

강령 :

내 양식 :

<input id="group_pilgrims_attributes_1399739023635_surname" name="group[pilgrims_attributes][1399739023635][surname]" placeholder="Last Name" size="30" type="text"> 

LINK_TO :

<%= simple_form_for [@trip, @group] do |f| %> 
    <ul id="infoTabs" class="nav nav-tabs"> 
    <li class="active"><a href="#pilgrim_info" data-toggle="tab">Pilgrims</a></li> 
    <li><a href="#contact" data-toggle="tab">Contact Info</a></li> 
    <li><a href="#payments" data-toggle="tab">Payments</a></li> 
    </ul> 

<div class="tab-content"> 

    <div id="pilgrim_info" class="tab-pane active"> 
     <ul id="pilgrimTabs" class="nav nav-pills"> 
      <li><%= link_to_add_pilgrim_fields('+ Add Pilgrim', f, :pilgrims, :data => {:toggle => 'pill'}, :class => 'add-pilgrim') %></li> 
     </ul> 

     <div class="tab-content"> 
     </div> 
    </div> 

</div> 
<div class="row-fluid"> 
    <div class="actions span12"> 
    <%= f.submit :class => 'btn btn-primary' %> 
    <%= link_to 'Cancel', trip_groups_path(@trip), :class => "btn" %> 
    </div> 
</div> 
여기

내가 추가 순례자 버튼을 클릭 한 후 렌더링 년대 HTML의 조각이다 도우미

def link_to_add_pilgrim_fields(name, f, association, options = {}) 
    new_object = f.object.class.reflect_on_association(association).klass.new 
    fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder| 
    render(association.to_s , :f => builder) 
    end 
    link_to_function(name, "add_pilgrims_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")", options) 
end 

그리고 필드를 추가하는 자바 스크립트 함수 :

function add_pilgrims_fields(link, association, content) { 
    var new_id = new Date().getTime(); 
    var regex = new RegExp("new_" + association, "g"); 
    var display_id = $(".nav-pills").children().length; 
    $('.add-pilgrim').closest('li').after('<li><a href="#pilgrim'+ new_id +'" data-toggle="pill">New Pilgrim ' + display_id + '</a><span>x</span></li>'); 
    $('.tab-content').append('<div class="tab-pane" id="pilgrim'+new_id+'">' + content.replace(regex, new_id) + '</div>'); 
} 

답변

0

자바 스크립트 함수는 HTML의 여분의 비트를 추가했다. 클래스 ".tab-content"를 가진 두 개의 요소가 있었으므로 두 탭 영역 모두에 추가되었습니다. 양식을 제출할 때 빈 양식을 제출했습니다. 생성 된 두 탭 모두 동일한 ID를 가졌기 때문입니다.

제가

을 $ ('traveller_form_tabs')이 라인

$('.tab-content').append('<div class="tab-pane" id="pilgrim'+new_id+'">' + content.replace(regex, new_id) + '</div>'); 

}

변화 ('+ content.replace (정규식 NEW_ID가) +')에 추가.; }

그리고 그것은 이제 필드에 입력되는 값을 제출있어 탭

<div id="pilgrim_info" class="tab-pane active"> 
    <ul id="pilgrimTabs" class="nav nav-pills"> 
     <li><%= link_to_add_pilgrim_fields('+ Add Pilgrim', f, :pilgrims, :data => {:toggle => 'pill'}, :class => 'add-pilgrim') %></li> 
    </ul> 

    <div class="tab-content" id="traveller_form_tabs"> 
    </div> 

에 ID를 추가했다.