2011-08-17 23 views
4

したがって、ネストされたモデル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を使いこなすと、うまくいくように見えます。

ありがとうございます!

+0

あなたのコントローラコードに問題があると思います。とにかくあなたの子供のインデックスは正確に何ですか?あなたがリストアップしたいずれのモデルにもインデックスフィールドは表示されません。あなたはIDを意味しますか? – Matthew

+0

私はlink_to_add_fieldsコードの仕組みを誤解しているかもしれませんが、それは私が参照していた子インデックスでした。 Rails 3では、動的に作成されないネストされたフォーム要素の子インデックスを自動的に挿入するようになっているようです。つまり、最初の挿入フィールドの名前属性は です。 "gradebook_settings [assignment_types_attributes [0] [name]" ここで、0はchild_indexです。 –

+0

私は同じ動作を見ています、それは編集/更新アクションではなく、新しい/作成アクションのみにあります。フォームフィールドに子インデックスがありません。 – Micah

答えて

0

javascriptであなたのDOMのトラバースをチェックしてください。私の使用例で

、私は次のスクリプトがあります:あなたが目指しているものと同様の結果を達成するために代わり

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

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

を。

.prevセレクタを呼び出すと、前のdivにジャンプしていると思います。これは、達成しようとしているものについてDOMツリーをあまりにも遠くに移動していると思います。