2011-09-23 1 views
2

레일 스 캐스트 번호 197에 표시된대로 레코드를 추가하려고하는 곳의 어플리케이션이 있습니다. 학부모/자녀 관계의 한 단계 : 환자 및 사건 만 있습니다. 코드는 자식 레코드 (이벤트)를 제거하는 데는 문제가 없지만 다음과 같은 이유로 레코드를 추가하지 못합니다. 나는 새 Object를 생성하고 폼에 표시 할 필드를 생성 할 수 있으며 폼은 괜찮아 보입니다. 그러나 : child_index가 생성 된 html의 name 속성에 없습니다. 생성 된 HTML의 예는 다음Railscast 197에 설명 된대로 양식에 동적으로 자식 필드를 추가하면 사용되지 않습니다. child_index 매개 변수로 html 이름 특성 생성

<textarea cols="30" id="patient_events_attributes_description" name="patient[events_attributes][description]" rows="3"></textarea> 

기존 레코드의 HTML은 : [1] 기존의 레코드에 새로운 HTML에서 누락

<textarea cols="30" id="patient_events_attributes_1_description" name="patient[events_attributes][1][description]"  rows="3">Opgepakt met gestolen goederen</textarea> 

참고있다. 물론 1이 아니어야하지만 new_xxx는 고유 번호로 바뀝니다. 그러나 전체 [new_xxx]가 생성 된 html에 없습니다. 누구가 틀린가 생각하고 있는가?

저는 Ruby 1.9.2와 Rails 3.0.10을 사용하고 있습니다. 프로토 타입이없는 JQuery 또는 쿼리 ujs 있습니다.

내가 사용하는 코드는 여기에 다음과 같다,하지만이 Railscast 코드의 복사본입니다 :이 코드가 작동하지 않습니다 다른 의견을 찾을 수 없어

def link_to_remove_fields(name, f) 
    f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)") 
    end 

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

function remove_fields(link) { 
    $(link).prev("input[type=hidden]").val = "1"; 
    $(link).closest(".fields").hide(); 
} 

function add_fields(link, association, content) { 
    alert(content); 
    var new_id = new Date().getTime(); 
    var regexp = new RegExp("new_" + association, "g"); 
    $(link).before(content.replace(regexp, new_id)); 
} 

, 그래서 나는 아주 잘못된 것을해야 할 것입니다. 거기에 어떤 아이디어가 있습니까?

답변

1

fields_for의 소스 코드를 살펴본 후에 이라는 두 가지 문제점을 발견했습니다. 1. : child_index 매개 변수가 사용되지 않고 대신 : index 옵션이 사용되었습니다. 2. fields_for는 전달 된 객체가 활성 레코드 객체 또는 배열 인 경우에만 올바른 html을 생성합니다. 새로운 빈 개체를 [0] 항목으로 사용하여 형식 배열에 전달 된 매개 변수를 변경했습니다.

이 기능에 대한 문서가 없습니다. 당신이 거기서 태어나지 않는 한, ROR은 사용하는데 아주 많은 시간을 소비합니다.

마지막으로 작동하는 코드는 다음과 같습니다. 더 많은 레코드를 추가하려면 '99'를 고유 번호로 바꿔야합니다.

아직까지 @ patient.update_attributes (params [: patient])가 오류를 발생시키지 만 최악의 부분 (html 추가)은 수정되었습니다.

def link_to_add_fields(name, g, association) 
new_object = [] 
new_object[0] = g.object.class.reflect_on_association(association).klass.new 
fields = g.fields_for(association, new_object, :index => '99') do |builder|  # , {:child_index => "new_#{association}"} new_#{association} 
    render(association.to_s.singularize + "_fields", :f => builder) 
end 
link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")