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