Fields_for,如何在控制器中使用这些数据
Fields_for, how to use this data in controller
我不知道如何使用在 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 以及如何处理数据的文档。欢迎提供帮助!
编辑1:
这是视图的样子
= 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
提前致谢
如果您查看您的参数,您没有传递 order_items_attributes
,您传递的是 order_item
。也许如果你改变这个,你的运气会更好。
最好的测试方法是启动 rails 控制台并将您的参数复制到控制台中,看看是否可以让它在那里工作。如果你不去那儿,它就不会在前端工作。
还要确保您在 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_for 变得非常时髦,您应该查看一个名为 cocoon
的 gem
我不知道如何使用在 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 以及如何处理数据的文档。欢迎提供帮助!
编辑1: 这是视图的样子
= 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
提前致谢
如果您查看您的参数,您没有传递 order_items_attributes
,您传递的是 order_item
。也许如果你改变这个,你的运气会更好。
最好的测试方法是启动 rails 控制台并将您的参数复制到控制台中,看看是否可以让它在那里工作。如果你不去那儿,它就不会在前端工作。
还要确保您在 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_for 变得非常时髦,您应该查看一个名为 cocoon
的 gem