我迷失了如何使用rails中使用fields_for获得的数据。该数组如下所示:
"order"=>{"order_item"=>{"1"=>{"quantity"=>"1"}, "2"=>{"quantity"=>"1"}}}
但我不确定如何在控制器中获取和使用这些数据。为了您的信息,我需要通过id找到OrderItem:
.. "order_item"=>{"1 (<-- this number is the id!)" ..
然后更新该order_item的数量。
我试着接受这样的参数:
def order_params
params.require(:order).permit( order_item_attributes: [ :quantity ])
end
那应该是正确的,对吧?
在控制器中我想做这样的事情:
order_params[order_item_attributes].each do |item_id|
@orderitem = OderItem.find_by(id: item_id)
@orderitem.update(quantity: item_id[:quantity])
#... etc
我知道最后一个代码不正确,但我希望它可以帮助你理解我正在尝试做的事情。我可以找到关于fields_for以及如何处理数据的文档。欢迎帮助!
EDIT1: 这就是视图的样子
= form_for @order, :url => admin_update_order_path, :html => {:method => :post} do |f|
%table.detail_table
%tr
%th
%b Product
%th
%b Prijs
%th
%b Aantal
%th
%b Totaal
%th
%b Opties
- @order_items.each do |item|
%tr
%td
= item.product.name
%br
- x = 0
- item.product.product_attachments.each do |attachment|
-if item.product.id == attachment.product_id && x == 0
= image_tag attachment.image_url(:small)
- x = 1
%td= number_to_currency((item.product.price), :unit => "€", :separator => ",", :delimiter => ' ')
%td
= f.fields_for :order_items do |item_form|
= item_form.text_field :quantity, :class => "item_field"
%td= number_to_currency((item.product.price*item.quantity), :unit => "€", :separator => ",", :delimiter => ' ')
%td= link_to 'Verwijderen', item, method: :delete, data: { confirm: 'Weet u zeker dat u dit product uit dit order wilt verwijderen?' }
%br/
= f.submit
提前致谢
答案 0 :(得分:1)
如果你看看你的params,你没有传递order_items_attributes
你正在通过order_item
。也许如果你改变它,你会有更好的运气。
测试此功能的最佳方法是启动rails控制台并将params复制到控制台中,看看是否可以在那里工作。如果你不在那里那么它就不会在前端工作。
另外,请确保您在order_items的订单模型上设置了accepts_nested_attributes_for。
编辑2
= f.fields_for item, index: item.id do |item_form|
= item_form.text_field
上面应该是
= f.fields_for :order_items do |item_form|
= item_form.text_field
您的订单型号应
has_many :order_items
accepts_nested_attributes_for :order_items
您的控制器应该允许这样的参数
def order_params
params.require(:order).permit( order_items_attributes: [:id :quantity])
end
此外,如果你想通过accepts_nested_attributes_来变得非常时髦,你应该看一下名为cocoon的宝石