Fields_for,如何在控制器中使用此数据

时间:2015-04-20 18:26:40

标签: ruby-on-rails-4.2

我迷失了如何使用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

提前致谢

1 个答案:

答案 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的宝石