使用带有fields_for的数组

时间:2012-06-26 17:17:06

标签: ruby-on-rails arrays 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 %>

但是我想用我在控制器中创建的数组替换:descriptbyuser - @descriptionsFromCurrentUser

这也是Ryan Bate的“nested_form_for”

任何指针都将非常感谢!

亚当

4 个答案:

答案 0 :(得分:27)

要为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 %>

答案 1 :(得分:20)

Docs for 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 :(得分:5)

我发现这是最干净的方式

如果您正在使用直接数据并希望在不使用任何这些@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"}
  ]
}

答案 3 :(得分:5)

除了勉强知道的答案之外(由于声誉点而无法添加评论) -

对于非主动记录案例,除了persisted?之外,我还必须在班级中定义*_attributes=(attributes)