我正在努力弄清楚如何动态改变记录。
我希望输入字段从人[名称改为人物[] [姓名]
更改<%= f.fields_for :people, nil, prefix: "people[]" do |fy| %>
<% 4.times.each do %>
<div class="grid-1">
<%= fy.text_field :name %>
</div>
<% end %>
<% 4.times.each do %>
<div class="grid-1">
<%= fy.text_field :city %>
</div>
<% end %>
<% end %>
使用带有活动记录的michael第二种方法的输出:
year => [{":name"=>""}, {":name"=>""}, {":name"=>""}, {":name"=>"", ":city"=>""}, {":city"=>""}, {":city"=>""}, {":city"=>"", ":town"=>""}... etc]
答案 0 :(得分:0)
我将在这里留下原始答案,因为它显示了如何在使用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和friends)。让我们手工制作它。
通常,当我构建这样的表单时,我希望能够在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”在控制器中。< / p> 祝你好运!