Пустые ассоциации для fields_for, если контент добавляется динамически через jquery
Я построил form_for с 4 ассоциированными моделями. Я создал вложенные fields_for, которые можно динамически добавлять с помощью приведенного ниже кода. Моя форма работает, если я вызываю метод 'edit', но если я использую метод ниже, чтобы добавить новые данные, fields_for остается пустым и не показывается.
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", data: {id: id, fields: fields.gsub("\n", "")})
end
Это прекрасно работает, если я хочу добавить только одну форму модели. Но если добавленный контент, у которого есть fields_for для вложенных fields_for text_fields, не создается. На мой взгляд, это потому, что я не строю ассоциации. Как я могу исправить этот метод, чтобы сделать это?
1 ответ
У меня есть очень похожий метод (на основе сообщения в блоге Итая Грудева), в котором я установил child_index
как nil
а затем используйте jQuery, чтобы заменить его меткой времени (чтобы можно было добавить много записей, избегая их id
).
Итак, по моему application_helper.rb
файл у меня есть:
def link_to_add_fields(name = nil, f = nil, association = nil, options = nil, html_options = nil, &block)
f, association, options, html_options = name, f, association, options if block_given?
options = {} if options.nil?
html_options = {} if html_options.nil?
if options.include? :locals
locals = options[:locals]
else
locals = { }
end
if options.include? :partial
partial = options[:partial]
else
partial = association.to_s.singularize + '_fields'
end
new_object = f.object.class.reflect_on_association(association).klass.new
fields = f.fields_for(association, new_object, child_index: nil) do |builder|
render(partial, locals.merge!( fields: builder))
end
html_options['data-form-prepend'] = raw CGI::escapeHTML( fields )
html_options['href'] = '#'
content_tag(:a, name, html_options, &block)
конец
А потом я добавил файл Coffeescript под названием dynamic_tables.js.coffee
в котором я нахожу новые добавленные поля, заменяю их имя временной меткой (чтобы они все были проиндексированы как группа) и добавляю форму к цели (скрытый элемент, который я добавил внизу таблицы и пометил его как prepend_target
). Итак, у меня есть:
$('[data-form-prepend]').click (e) ->
target = $($(this).attr('prepend_target'))
obj = $($(this).attr('data-form-prepend'))
current_time = (new Date).getTime()
obj.find('input, select, textarea').each ->
$(this).attr 'name', ->
$(this).attr('name').replace 0, current_time
return
obj.insertBefore target
false
Это должно делать свое дело. Надеюсь это поможет.