使用具有fields_for阵列(using an array with fields_for)

2019-07-30 03:22发布

我怎样才能通过使用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”

任何指针将不胜感激!

亚当

Answer 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这里是你的阵列。



Answer 2:

要使用集合fields_for和它的工作,你所期望的方式,模型需要接受集合嵌套属性。 如果集合是ActiveRecord一个一对多的关系,使用accepts_nested_attributes_for类宏。 如果集合不是ActiveRecord一个一对多的关系,你需要实现一个集合的getter和属性的集合制定者。

如果它是一个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 %>


Answer 3:

我发现这是最彻底的方法

如果您正在使用直线数据工作,并要发送回一个数组,而不使用任何这些@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"}
  ]
}


Answer 4:

一个除了barelyknown的回答(是不是能够作为注释添加由于信誉分) -

对于非ActiveRecord的情况下,我也必须定义persisted? 我除了上课*_attributes=(attributes)



文章来源: using an array with fields_for