【问题标题】:fields_for alter the record namefields_for 更改记录名称
【发布时间】:2014-12-13 06:19:03
【问题描述】:

我正在努力弄清楚如何即时更改记录。

我想将输入字段从people[name 更改为people[][name]

<%= 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 %>

使用带有活动记录的迈克尔第二种方法的输出:

 year => [{":name"=>""}, {":name"=>""}, {":name"=>""}, {":name"=>"", ":city"=>""}, {":city"=>""}, {":city"=>""}, {":city"=>"", ":town"=>""}... etc]

【问题讨论】:

  • 有什么理由不想在这里使用模型 Person 吗?
  • 您真正想在这里做什么?我试图了解您为什么要提示同一字段:name 四次。顺便说一句,您在列出的代码中有一个语法错误(悬空逗号),所以不清楚这是否是您尝试过的。
  • 所以我想以这种形式收集它们。 {人:[{name:"ggg"},{name:"ggg"}]}

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


【解决方案1】:

我将在此处保留原始答案,因为它显示了在您将 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”位于控制器中。

祝你好运!

【讨论】:

  • 我喜欢你的实现.. 但在这里我们没有为此使用 ActiveRecord.. 只是普通的旧对象.. 这是因为我们正在与旧对象进行通信.. 你能建议实现这一点的方法吗没有活动记录?干杯
  • 查看上面的扩展答案。
  • 谢谢迈克尔.. 我想我们已经很接近了.. 在这种情况下,名称和城市在水平行中呈现 4 次.. 我已经更新了上面的问题。这是输出.. 年份=> [{":name"=>""}, {":name"=>""}, {":name"=>""}, {":name"=>"", ":city" =>""}, {":city"=>""}, {":city"=>""}, {":city"=>"", ":town"=>""}...等]
猜你喜欢
  • 2013-04-18
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2015-04-18
  • 1970-01-01
  • 2017-10-07
相关资源
最近更新 更多