ada*_*ale 18 arrays ruby-on-rails 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 %>
Run Code Online (Sandbox Code Playgroud)
但我想用我在控制器中创建的数组替换:descriptbyuser - @descriptionsFromCurrentUser
这也是Ryan Bate的"nested_form_for"内部
任何指针将不胜感激!
亚当
bar*_*own 28
要使用集合fields_for并使其按预期方式工作,模型需要接受集合的嵌套属性.如果集合是ActiveRecord一对多关系,请使用accepts_nested_attributes_for类宏.如果集合不是ActiveRecord一对多关系,则需要实现集合getter和集合属性setter.
如果是ActiveRecord关系:
class Person
has_many :projects
# this creates the projects_attributes= method
accepts_nested_attributes_for :projects
end
Run Code Online (Sandbox Code Playgroud)
如果是非ActiveRecord关系:
class Person
def projects
...
end
def projects_attributes=(attributes)
...
end
end
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,形式都是一样的:
<%= form_for @person do |f| %>
...
<%= f.fields_for :projects, @active_projects do |f| %>
Name: <%= f.text_field :name %>
<% end %>
...
<% end %>
Run Code Online (Sandbox Code Playgroud)
jdo*_*doe 20
文档fields_for清楚地向您展示了使用数组的方式:
或者要使用的集合:
Run Code Online (Sandbox Code Playgroud)<%= 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 这是你的阵列.
小智 6
我发现这是最
简洁的方法,如果你正在使用直接数据并想要发回一个数组而不使用任何这些@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 %>
Run Code Online (Sandbox Code Playgroud)
你的params数据应该像这样返回
"team" => {
"people" => [
{"first_name" => "Michael", "last_name" => "Jordan"},
{"first_name" => "Steve", "last_name" => "Jobs"},
{"first_name" => "Barack", "last_name" => "Obama"}
]
}
Run Code Online (Sandbox Code Playgroud)