【问题标题】:Rails 5 fields_for only sends last paramsRails 5 fields_for 只发送最后一个参数
【发布时间】:2018-10-19 09:05:48
【问题描述】:

我一直在用头撞砖墙,所以是时候寻找更聪明的人了。

我正在尝试使用 form_tag 和 fields_for 创建一个模型的多个记录。我一直在关注我能找到的所有帮助/问题/指南,但它似乎对我不起作用。我想知道 Rails 5 是否发生了变化,但更有可能是我。

基本上我想要api page底部列出的任务系统的新/创建版本,类似于this guys puppy creator

“新”页面加载了我喜欢的尽可能多的记录,所以这部分没问题,但它似乎没有创建要发送的集合,它只是覆盖,因此通过最后一组发送params 所以只创建一条记录。

我有什么。

# routes
resources :container_returns

控制器

# container returns controller
def new
  @containers = Container.where(id: params[:container_ids])
  @container_returns = []
  @containers.each do |container|
    @container_returns << ContainerReturn.new(
      {
        container_id: container.id,
        quantity: container.amount,
        uom: container.uom,
        material_restriction_id: container.material_restriction_id
      }
    )
  end  
end

查看

# new.html.erb
<%= form_tag container_returns_path, method: :post do %>

  <% @container_returns.each do |container_return| %>
    <%= fields_for 'returns[]', container_return, hidden_field_id: true do |cr| %>

      <div class="field">
        <%= cr.label :container_id %>
        <%= cr.number_field :container_id %>
      </div>

      <div class="field">
        <%= cr.label :material_restriction_id %>
        <%= cr.number_field :material_restriction_id %>
      </div>

      <div class="field">
        <%= cr.label :quantity %>
        <%= cr.text_field :quantity %>
      </div>

      <div class="field">
        <%= cr.label :uom %>
        <%= cr.text_field :uom %>
      </div>

    <% end %>        
  <% end %>

  <%= submit_tag "lots of returns" %>

<% end %>

哪个提交

# params submitted
Started POST "/container_returns" for 127.0.0.1 at 2018-10-19 11:00:48 +0200
Processing by ContainerReturnsController#create as HTML
Parameters: {
  "utf8"=>"✓", "authenticity_token"=>[removed],
  "returns"=>{"container_id"=>"405", "material_restriction_id"=>"", "quantity"=>"100.0", "uom"=>"kg"}, "commit"=>"lots of returns"
}

希望这只是我错过的一些愚蠢的事情。

更新: 如果我向表单添加索引,它现在相信我的对象是不同的,并通过我需要的所有参数发送。

<% @container_returns.each_with_index do |container_return, index| %>
  <%= fields_for 'returns[]', container_return, index: index do |cr| %>
  [...]

【问题讨论】:

  • 检查@containers的大小。如果只有一个带有params[:container_ids]的容器,那么只有一个container_return被初始化并且只有一个params被传递。
  • 嗨,在我的测试中,我有 4 个容器,每个容器都呈现在新表单上。所以一切都在那里,所以这不是问题。
  • 如果您从 fields_for 中删除 hidden_field_id: true,它会改变什么吗?
  • 好的,试试把fields_for里面的'returns[]'改成'container_returns[]'
  • 如果将fields_for 更改为&lt;%= fields_for container_return do |cr| %&gt; 会怎样?

标签: ruby-on-rails fields-for


【解决方案1】:

如更新中所述,如果我在初始创建中添加一个 ID,它会构建我期望的正确数组。我还发现,如果我通过一个同样有效的索引位置发送。

<% @container_returns.each_with_index do |container_return, index| %>
  <%= fields_for 'returns[]', container_return, index: index do |cr| %>
  [...]

给了我我所期待的

Parameters: {
  "returns"=>{"0"=>{"container_id"=>"400",...},
              "1"=>{"container_id"=>"401",...},
              etc.
             },
  "commit"=>"lots of returns"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2014-10-30
    • 1970-01-01
    相关资源
    最近更新 更多