したがって、ネストされたモデルRailscastで新しいモデルを追加するコードを使用しています。何らかの理由で、新しいフィールドを追加するコードのfields_forがchild_index引数を無視しているようです。別のモデルで同じコードを使用していて、完璧に動作しているので、それは私を絶対に動かすものではありません。ネストされたRailsモデル - 作成時に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
Javascriptを:
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);
}
私は新しいモデルを作成するときに、私は適切なフィールドの全てを取得し、彼ら子インデックスが欠落しています - それは空ではありません([])、それだけではありません。なぜこれが起こっているかもしれないのか?私の他のネストされたモデルと完全に動作し、通常のfields_forでchild_indexを使いこなすと、うまくいくように見えます。
ありがとうございます!
あなたのコントローラコードに問題があると思います。とにかくあなたの子供のインデックスは正確に何ですか?あなたがリストアップしたいずれのモデルにもインデックスフィールドは表示されません。あなたはIDを意味しますか? – Matthew
私はlink_to_add_fieldsコードの仕組みを誤解しているかもしれませんが、それは私が参照していた子インデックスでした。 Rails 3では、動的に作成されないネストされたフォーム要素の子インデックスを自動的に挿入するようになっているようです。つまり、最初の挿入フィールドの名前属性は です。 "gradebook_settings [assignment_types_attributes [0] [name]" ここで、0はchild_indexです。 –
私は同じ動作を見ています、それは編集/更新アクションではなく、新しい/作成アクションのみにあります。フォームフィールドに子インデックスがありません。 – Micah