2012-02-22 9 views
2

をJEEのRails 3.2アプリで使用している場合、Cacoonを使用して複雑なネストされたフォーム内にRailscast#102というオートコンプリートフィールドを実装しようとしています。Railsオートコンプリートは、親ではなくネストされたフォームで動作します。どうして?

親フォームで完全に機能する同様のオートコンプリートフィールドを取得できました。しかし、オートコンプリートをネストされたフォームで動作させることはできません。 JavaScriptが起動されていないようです。

私のフォームは、私は2つのJavaScript機能

$(function() { 
    $('.parent-name').autocomplete({ 
     source: $('.parent-name').data('autocomplete-source') 
    }); 
}); 

$(function() { 
    $('.grand-child-name').autocomplete({ 
     source: $('.grand-child-name').data('autocomplete-source') 
    }); 
}); 

を持つ親の自動補完が完璧に働いている

<%= form_for @parent do |f| %> 
<%= f.text_field :name, :class=>"parent-name", :data => {:autocomplete_source => Model.order(:name).map(&:name) } %> 
    <%= f.fields_for :children do |child| %> 
    <%= f.fields_for :grand_children do |grand_child| %> 
     <%= f.text_field :name, :class=>"grand-child-name", :data => {:autocomplete_source => Model.order(:name).map(&:name) } %> 
    <% end %> 
    <% end %> 
<% end %> 

ようになり、孫ではありません。何か不足していますか?これがネストされた形式ではうまくいかない理由はありますか?それとも私は私のアプローチで間違いを犯しましたか?

すべてのポインタに感謝します。

EDIT

壮大-子要素が非同期に追加され、親要素は、ページのロード時にレンダリングされています。これは問題の鍵であるようです。編集する既存のレコードを開くと(ページの読み込み時にフィールドがレンダリングされて読み込まれる)、オートコンプリートがこれらのフィールドで機能しています。正しい方向に私を指摘クリスDrappierへ

SOLUTION

感謝。彼は、新しいフォーム要素を追加するときにオブザーバーを追加する必要があると言いました。

私は今、2つのjquery関数を持っています。元

$(function() { 
    $('.grand-child-name').autocomplete({ 
     source: $('.grand-child-name').data('autocomplete-source') 
    }); 
}); 

$(function() { 
    $(document).on("focus",".grand-child-name", function() { 
     $('.grand-child-name').autocomplete({ 
      source: $('.grand-child-name').data('autocomplete-source') 
     }); 
    }); 
}) 

クリスは.live()関数の方に私を指摘しながら、どうやらこれは減価償却されている、と.on(フォーカス)が正しい機能を提供します。

おかげさまでクリス!

+0

ページが最初に読み込まれたときにフォーム全体がレンダリングされていますか?またはこれらの要素を非同期で挿入していますか?また、孫のテキストフィールドを子に移動するとどうなりますか?それはあなたのために次に働くのですか? –

+0

親では、モデルでaccepts_nested_attributes_forを実行していますか? http://asciicasts.com/episodes/196-nested-model-form-part-1 –

+0

@ChrisDrappierあなたの提案に感謝します。私は非同期的に要素を挿入していますが、これが問題のようです。既存のレコードを開き、ロード中にフィールドがレンダリングされると、オートコンプリートが機能します。どうしてこれなの?そして私はそれについて何ができますか?私はこれを学ぶのを助けるための正しい方向の指針を本当に感謝しています。 –

答えて

3

これは難しい問題ですが、問題は、新しいフォーム要素を追加するときにオブザーバーを追加する必要があることだと思います。 jqueryを使用している場合、このケースを処理する機能があります。 live()のjqueryのapiドキュメントを参照してください。私はそれがあなたがする必要があるところにあなたを得るべきだと思います。

+0

おかげさまで@chris、私はこれを調べて報告します。 –

+0

うわー、なんてクールな修正! .live()ではなく.on()を使用しましたが、修正は初めてでした。私のjavascriptスキルはそれほど熱くないので、私にとっては珍しいことです。私は質問に上記の私のフルソリューションを掲載します。クリスおかげで! –

+0

@ChrisDrappier 'live'は廃止予定です。 – onebree

関連する問題