используя массив с fields_for

Как я могу перебирать массив объектов (все той же модели) с помощью fields_for ? Массив содержит объекты, созданные пользователем current_user.

В настоящее время у меня есть:

<%= f.fields_for :descriptionsbyuser do |description_form| %>
<p class="fields">
    <%= description_form.text_area :entry, :rows => 3 %>
    <%= description_form.link_to_remove "Remove this description" %>
    <%= description_form.hidden_field :user_id, :value => current_user.id %>
</p>
<% end %>

Но я хочу заменить :descriptionsbyuser массивом, который я создал в своем контроллере — @descriptionsFromCurrentUser

Это также находится внутри «nested_form_for» Райана Бейта.

Любые указатели будут очень признательны!

Адам


person adamteale    schedule 26.06.2012    source источник


Ответы (4)


Документация для fields_for наглядно демонстрирует способ использования массивов:

Или коллекция, которая будет использоваться:

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :projects, @active_projects do |project_fields| %>
    Name: <%= project_fields.text_field :name %>
  <% end %>
  ...
<% end %>

@active_projects вот ваш массив.

person jdoe    schedule 26.06.2012
comment
Это не работает для меня. Я получаю что-то вроде undefined method 'name' for #<Array:0xaedada0>. - person Ajedi32; 15.04.2014
comment
@ Ajedi32 et al =› Ваша модель должна реализовать установщик для атрибутов коллекции. Смотрите ответ от малоизвестного. - person barelyknown; 08.07.2014

Чтобы использовать коллекцию для fields_for и заставить ее работать так, как вы ожидаете, модель должна принимать вложенные атрибуты для коллекции. Если коллекция представляет собой отношение "один ко многим" ActiveRecord, используйте макрос класса accepts_nested_attributes_for. Если коллекция не является отношением ActiveRecord "один ко многим", вам потребуется реализовать средство получения коллекции и средство установки атрибутов коллекции.

Если это отношение ActiveRecord:

class Person
  has_many :projects

  # this creates the projects_attributes= method
  accepts_nested_attributes_for :projects
end

Если это отношения, отличные от ActiveRecord:

class Person
  def projects
    ...
  end

  def projects_attributes=(attributes)
    ...
  end
end

В любом случае форма одинакова:

<%= form_for @person do |f| %>
  ...
  <%= f.fields_for :projects, @active_projects do |f| %>
    Name: <%= f.text_field :name %>
  <% end %>
  ...
<% end %>
person barelyknown    schedule 08.07.2014
comment
+1 за подробности реализации не-ActiveRecord. Почему-то мой глаз отказывался видеть то, что было ясно объяснено в документах... - person m_x; 18.11.2014

я обнаружил, что это самый чистый способ

если вы работаете с прямыми данными и хотите отправить обратно массив без использования каких-либо @objects

<%= form_for :team do |t| %>
  <%= t.fields_for 'people[]', [] do |p| %>
    First Name: <%= p.text_field :first_name %>
    Last Name: <%= p.text_field :last_name %>
  <% end %>
<% end %>

ваши данные params должны вернуться вот так

"team" => {
  "people" => [
    {"first_name" => "Michael", "last_name" => "Jordan"},
    {"first_name" => "Steve", "last_name" => "Jobs"},
    {"first_name" => "Barack", "last_name" => "Obama"}
  ]
}
person Richard Kuo    schedule 19.02.2015

Дополнение к едва известному ответу (не удалось добавить в качестве комментария из-за очков репутации) -

Для случая неактивной записи мне также пришлось определить persisted? в моем классе в дополнение к *_attributes=(attributes).

person Sid Krishnan    schedule 20.04.2015