Пустые ассоциации для 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

Это должно делать свое дело. Надеюсь это поможет.

Другие вопросы по тегам