Формы для создания и обновления полей массива Mongoid

Я изо всех сил пытался создать форму для модели Mongoid, которая имеет поле массива. Я хочу, чтобы в моей форме было текстовое поле для каждой записи в массиве. Если я создаю новую запись, по умолчанию будет одно пустое поле (и некоторый javascript для динамического добавления новых полей на страницу).

Я искал решение, используя fields_for, но похоже, что это более предназначено для обработки случая, когда у вас есть массив объектов / моделей, а не случай, который у меня есть, а именно массив строк.

Я буду использовать пример человека и номера телефона.

class Person
  include Mongoid::Document
  field :name, :type => String
  field :phone_numbers, :type => Array
end

В качестве контроллера просто возьмем типичный контроллер, но в методе new я инициализировал массив phone_number одной пустой строкой.

Вот код формы:

  <%= form_for(@person) do |f| %>
    <div class="field">
      <%= f.label :name %><br />
      <%= f.text_field :name %>
    </div>
    <div class="field">
      <%= f.label :phone_numbers %><br />
      <% @person.phone_numbers.each do |phone_number| %>
        <%= text_field_tag "person[phone_numbers][]", phone_number %>
      <% end %>
    </div>
  <% end %>

Все работает нормально. Есть несколько вещей, которые мне не нравятся.

  • Жестко запрограммированное имя поля в вызове text_field_tag.
  • Использование text_field_tag ​​вместо f.text_field
  • У меня возникло ощущение, что я должен каким-то образом использовать fields_for вместо этого

Есть ли у кого-нибудь лучшие предложения по как это реализовать? Или вы считаете это правильным?

13
задан Gus 12 January 2015 в 23:58
поделиться