fields_for更改记录名称

时间:2014-10-17 15:53:36

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 actionview

我正在努力弄清楚如何动态改变记录。

我希望输入字段从人[名称改为人物[] [姓名]

更改
<%= 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]

1 个答案:

答案 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> 祝你好运!