アプリケーションのネストされたフォームフィールドにjquery-ui日付ピッカーを追加しようとしていますが、新しいフィールドでDOMを更新すると、作成されたフィールドに日付ピッカーが表示されません。これが私がアプリケーションのために働いているコードです。
<%= form_for(@load) do |f| %>
<%= f.error_messages %>
<%= f.fields_for :destinations do |builder| %>
<%= render "destination_fields", :f => builder %>
<% end %>
<p><%= link_to_add_fields " Add Destination", f, :destinations %></p>
<% end %>
_destination_fields.html.erb
============================
<fieldset>
<%= f.text_field :arrival_date, :placeholder => "From:", :class => "datepicker" %>
</fieldset>
フィールドを追加するためのコーヒースクリプト:
jQuery ->
$('form').on 'click', '.add_fields', (event) ->
time = new Date().getTime()
regexp = new RegExp($(this).data('id'), 'g')
$(this).before($(this).data('fields').replace(regexp, time))
event.preventDefault()
フィールドを追加するための関数:
def link_to_add_fields(name, f, association)
new_object = f.object.send(association).klass.new
id = new_object.object_id
fields = f.fields_for(association, new_object, child_index: id) do |builder|
render(association.to_s.singularize + "_fields", f: builder)
end
link_to(name, '#', class: "add_fields btn btn-primary icon-plus", data: { id: id, fields: fields.gsub("\n",""), :class => "datepicker" })
end
日付ピッカーを表示するために私が書いたJavaScript:
$(function() {
$(".datepicker").datepicker({ dateFormat: 'yy-mm-dd', autoSize:true });
});
$(function() {
$('.add_fields').on('click', function(){
$(this).datepicker({ dateFormat: 'yy-mm-dd', autoSize:true });
});
});
スタックオーバーフローでこの問題に対する他の解決策を見てきましたが、それらの実装はどれも私の問題に対して機能していません。ご覧のとおり、javascriptは、「datepicker」クラスが含まれるフィールドをチェックしてから、datepickerクラスを追加します。クリックすると新しいフィールドを追加するボタンにコールバック関数を追加する必要があると確信しています。これは私が行ったことですが、関数が正しく機能しない理由はわかりません。この問題を解決するためにさらに情報が必要な場合は、喜んで提供します。
ソリューション編集:
これを期待どおりに機能させるために、coffeescriptファイルを次のように変更しました。
jQuery ->
datepicker_update = -> $("input.datepicker").datepicker({ dateFormat: 'yy-mm-dd', autoSize:true })
$('form').on 'click', '.add_fields', (event) ->
time = new Date().getTime()
regexp = new RegExp($(this).data('id'), 'g')
$(this).before($(this).data('fields').replace(regexp, time))
event.preventDefault()
datepicker_update()
これは、以下の2つの回答を組み合わせたものです。