我将在此处保留原始答案,因为它显示了在您将 Rails 与 ActiveRecord 一起使用的情况下如何处理此问题。原审问官已在下方澄清了他的问题,因此请向下滚动查看他已澄清问题的答案。
您需要将更多人添加到您的记录中。假设你有这个:
class Family < ActiveRecord::Base
has_many :people, inverse_of: :family
accepts_nested_attributes_for :people
end
class Person < ActiveRecord::Base
belongs_to :family, inverse_of: :people
end
在您的控制器中,只需添加一些人:
def new
@family = Family.new
4.times { @family.people.build }
end
然后你就会拥有它们。
忘了,然后你需要简化你的表单:
<%= f.fields_for :people do |person_form| -%>
<%= person_form.text_field :name %>
<% end -%>
Rails 会处理剩下的事情。
明确回答:
现在的问题是如何在没有 ActiveRecord 的情况下执行此操作。在这种情况下,忘记使用表单构建器的东西(fields_for 和朋友)。让我们手动构建它。
一般来说,当我构建这样的表单时,我希望能够在 Ruby 中的结构和表单本身之间移动。
在您的情况下,您希望得到这样的哈希:
{ people: [{name:"ggg"}, {name:"ggg"}] }
我们想构建一个这样的表单:
<% records = params[:records] || { people: [ { name: 'name1' }, { name: 'name2' } ] } -%>
<%= form_tag nil, method: :get do -%>
<% records[:people].each do |person| -%>
<%= text_field_tag "records[people][][name]", person[:name] %>
<% end -%>
<%= submit_tag "submit" -%>
<% end -%>
当你提交它时,你会得到这个作为你的参数:
Parameters: {"utf8"=>"✓", "records"=>{"people"=>[{"name"=>"name1"}, {"name"=>"name2"}]}, "commit"=>"submit"}
例如,假设您将其扩展为“人”具有“名称”和“城市”。它仍然可以工作:
<% records = params[:records] || { people: [ { name: 'name1', city: 'Nashville' }, { name: 'name2', city: 'Brentwood' } ] } -%>
<%= form_tag nil, method: :get do -%>
<% records[:people].each do |person| -%>
<%= text_field_tag "records[people][][name]", person[:name] %>
<%= text_field_tag "records[people][][city]", person[:city] %>
<br />
<% end -%>
<%= submit_tag "submit" -%>
<% end -%>
来自参数:
"records"=>{"people"=>[{"name"=>"name1", "city"=>"Nashville"}, {"name"=>"name2", "city"=>"Brentwood"}]}
如果你想强制它拥有一定数量的项目,有几种不同的方法。请注意,在这种情况下,您可能希望强制执行项目数或专门忽略空白。像这样的小改动完成了确保它始终显示 4 组名称/城市的任务:
<% records = params[:records] || { people: [ { name: 'name1', city: 'Nashville' }, { name: 'name2', city: 'Brentwood' } ] } -%>
<%= form_tag nil, method: :get do -%>
<% 0.upto(3) do |x| -%>
<%= text_field_tag "records[people][][name]", (records[:people][x][:name] rescue '') %>
<%= text_field_tag "records[people][][city]", (records[:people][x][:city] rescue '') %>
<br />
<% end -%>
<%= submit_tag "submit" -%>
<% end -%>
这会产生:
"records"=>{"people"=>[{"name"=>"name1", "city"=>"Nashville"}, {"name"=>"name2", "city"=>"Brentwood"}, {"name"=>"", "city"=>""}, {"name"=>"", "city"=>""}]}
这里需要注意的是,为了简单起见,我只是将所有这些都放在一个视图中,但您几乎肯定希望第一行(设置“记录”的位置)使用“@records”位于控制器中。
祝你好运!