그래서 중첩 모델 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를 사용하면 엉망으로 작동합니다.
감사합니다.
컨트롤러 코드에 문제가있는 것 같습니다. 어쨌든 자녀의 색인은 정확히 무엇입니까? 나열한 모델 중 하나에 색인 필드가 표시되지 않습니다. ID를 말하는 겁니까? – Matthew
link_to_add_fields 코드의 작동 방식을 잘못 이해했을 수도 있지만, 이는 내가 언급 한 자식 인덱스였습니다. 레일즈 3는 동적으로 생성되지 않는 중첩 된 폼 요소에 대해 자동으로 자식 인덱스를 삽입하는 것으로 처리됩니다. 즉 첫 번째 삽입 필드 중 하나의 name 속성은 "gradebook_settings [할당 _ 유형 _attributes [0] [이름]"입니다. 여기서 0은 child_index입니다. –
동일한 동작이 표시됩니다. 새 동작/생성 동작에만 적용되며 편집/업데이트 동작에는 적용되지 않습니다. 폼 필드에 하위 인덱스가 없습니다. – Micah