Используя массив с полями_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 %>
Но я хочу заменить: describebyuser на массив, который я создал в моем контроллере - @descriptionsFromCurrentUser
Это также внутри Ryan Bate "nested_form_for"
Любые указатели будут очень благодарны!
Адам
Ответы
Ответ 1
Документы для 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
Вот ваш массив.
Ответ 2
Чтобы использовать коллекцию для fields_for
и работать она так, как вы ожидаете, модель должна принимать вложенные атрибуты для коллекции. Если коллекция является отношением ActiveRecord
one-to-many, используйте макрос класса accepts_nested_attributes_for
. Если коллекция не является отношением ActiveRecord
one-to-many, вам необходимо реализовать сборщик и набор атрибутов коллекции.
Если это отношение 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 %>
Ответ 3
я нашел, что это самый чистый способ
если вы работаете с прямыми данными и хотите отправить обратно массив без использования каких-либо из этих @объектов
<%= 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"}
]
}
Ответ 4
Добавление к едва известному ответу (не удалось добавить в качестве комментария из-за точек репутации) -
Для случая non-activerecord я также должен был определить persisted?
в моем классе в дополнение к *_attributes=(attributes)
.