Rails 5 fields_for 只发送最后一个参数
Rails 5 fields_for only sends last params
我一直在用头撞砖墙,所以是时候寻找更聪明的人了。
我正在尝试使用 form_tag 和 fields_for 创建一个模型的多个记录。我一直在关注我能找到的所有 help/issues/guides,但它似乎对我不起作用。我想知道它是否发生了变化 Rails 5 但更有可能是我。
基本上我想要一个 new/create 版本的任务系统,列在 api page, similar to this guys puppy creator 底部。
"new" 页面可以很好地加载我喜欢的记录,所以这部分没问题,但它似乎并没有创建要发送的集合,它只是覆盖并因此发送最后一组参数,所以只创建一个记录。
我有什么
# 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| %>
[...]
如更新中所述,如果我将 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"
}
我一直在用头撞砖墙,所以是时候寻找更聪明的人了。
我正在尝试使用 form_tag 和 fields_for 创建一个模型的多个记录。我一直在关注我能找到的所有 help/issues/guides,但它似乎对我不起作用。我想知道它是否发生了变化 Rails 5 但更有可能是我。
基本上我想要一个 new/create 版本的任务系统,列在 api page, similar to this guys puppy creator 底部。
"new" 页面可以很好地加载我喜欢的记录,所以这部分没问题,但它似乎并没有创建要发送的集合,它只是覆盖并因此发送最后一组参数,所以只创建一个记录。
我有什么
# 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| %>
[...]
如更新中所述,如果我将 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"
}