2011-08-17 2 views
4

그래서 중첩 모델 Railscast에서 새 모델을 추가하는 코드를 사용했습니다. 어떤 이유로 든 새로운 필드를 추가하는 코드의 fields_for는 child_index 인수를 무시하는 것 같습니다. 그것은 내가 다른 모델을 가지고 다른 곳에서 같은 코드를 사용하고 있으며 완벽하게 작동하기 때문에 절대로 바보입니다.중첩 레일스 모델 - 생성시 child_index 무시

모델 :

#models/gradebook_settings.rb 
class GradebookSettings 
include Mongoid::Document 

    has_many :assignment_types 
    accepts_nested_attributes_for :assignment_types, :allow_destroy => true 
    field :weight_type, :type => String, :default => "equal_weight" 

end 

#models/assignment_type.rb 
class AssignmentType 
include Mongoid::Document 

    has_many :assignments 
    belongs_to :gradebook_settings, :class_name => "GradebookSettings" 

    field :course_id, :type => Integer 
    field :name, :type => String 
    field :weight, :type => Integer 
end 

보기 및 부분 :

#views/gradebook_settings/new.html.haml 
=form_for @settings, :remote => true, :url => "/settings/#{@settings.id}/weight", :html => {:method => "put"} do |f| 
    %div{:id => "assignment_types", :style => ""} 
    =f.fields_for :assignment_types do |builder| 
     =render "assignment_type_fields", :f => builder 
    %div{:id => "weight_type"} 
    %div{:id => "equal_weight"} 
     =f.label :weight_type, "Equal Weight" 
     =f.radio_button :weight_type, :equal_weight 
    %div{:id => "no_weight"} 
     =f.label :weight_type, "No Weight" 
     =f.radio_button :weight_type, :no_weight 
    %div{:id => "manual_weight"} 
     =f.label :weight_type, "Manual Weight" 
     =f.radio_button :weight_type, :manual_weight 
    =link_to_add_fields "+ Add Type", f, :assignment_types 
    %button{:type => "button", :class => "button", :id => "submit_weight"}="Submit" 
    =close_openBox_button 


#views/gradebook_settings/_assignment_type_fields.html.haml 
%div{:class => "assignment_type"} 
    =f.text_field :name, {:size => "30"} 
    =f.text_field :weight, {:size => "3", :maxlength => "2", :float => "right"} 
    =f.hidden_field :_destroy, {:class => "type_destroy_field"} 
    %span{:class => "remove_button button"}=button_to_function "X", "remove_fields(this, 'assignment_type')" 

#helpers/application_helper.rb 
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| 
    render(association.to_s.singularize + "_fields", :f => builder) 
    end 
    button_to_function(name, "add_fields(this, '#{association}', '#{escape_javascript(fields)}')", :id => "add_range_button") 
end 

자바 스크립트 : 나는 새 모델을 만들 때

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

, 나는 적절한 모든 필드를 얻을 수 있지만, 하위 색인이 누락되었습니다.이 색인은 비어 있지 않으며 ([]), 단지 존재하지 않습니다. 이것이 일어날 수있는 이유에 대한 아이디어가 있습니까? 그것은 내 중첩 된 다른 모델과 완벽하게 작동하며, 정규 field_for에서 child_index를 사용하면 엉망으로 작동합니다.

감사합니다.

+0

컨트롤러 코드에 문제가있는 것 같습니다. 어쨌든 자녀의 색인은 정확히 무엇입니까? 나열한 모델 중 하나에 색인 필드가 표시되지 않습니다. ID를 말하는 겁니까? – Matthew

+0

link_to_add_fields 코드의 작동 방식을 잘못 이해했을 수도 있지만, 이는 내가 언급 한 자식 인덱스였습니다. 레일즈 3는 동적으로 생성되지 않는 중첩 된 폼 요소에 대해 자동으로 자식 인덱스를 삽입하는 것으로 처리됩니다. 즉 첫 번째 삽입 필드 중 하나의 name 속성은 "gradebook_settings [할당 _ 유형 _attributes [0] [이름]"입니다. 여기서 0은 child_index입니다. –

+0

동일한 동작이 표시됩니다. 새 동작/생성 동작에만 적용되며 편집/업데이트 동작에는 적용되지 않습니다. 폼 필드에 하위 인덱스가 없습니다. – Micah

답변

0

자바 스크립트에서 DOM 통과를 확인하십시오. 당신이 목표로하는 것과 비슷한 결과를 달성하기 위해

$(this).before($(this).data('fields').replace(regexp, time)) 

대신

$(link).parent().prev().append(html); 

의 내 사용의 경우

, 나는 다음과 같은 스크립트를 가지고있다.

.prev 선택기를 호출하면 이전 div로 점프하고 있다고 생각하며 달성하려는 대상에 대해 DOM 트리가 너무 멀리 움직이고 있다고 생각합니다.

관련 문제