从Rails参数中排除项目

时间:2018-07-21 12:04:14

标签: ruby-on-rails

  

更新,解决方案是:   params['place']['menu_items_attributes'].reject! { |_, v| v['id'].empty? }

问题-我想从参数中排除某些项目,但不知道如何。

背景。一个地方有很多菜单项。在编辑页面上,您可以使用javascript添加新项目:我克隆了第一个现有节点,并将ID替换为随机数(例如1532174166502)。为了保存这些生成的项目,您必须提交表格。

提交表单时,我在参数中搜索具有空ID的菜单项并创建它们。之后,我将更新其他所有内容。

Rails无法正确更新所有内容,因为我的手工菜单项(在参数中)没有ID(显然为空白)。我想排除那些新创建的菜单项。

before_action :find_place, only: [:show, :edit, :update, :destroy]
before_action :add_menu_items, only: [:update]

# PATCH/PUT /admin/places/:id
def update
  if @place.update(place_params)
    render json: {}, status: :ok
  else
    render json: {}, status: :internal_server_error
  end
end

# The error
# ActiveRecord::RecordNotFound (Couldn't find Product with ID=1 for MenuItem with ID=)

# Params
# {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"rOgxn...uitQ==", "place"=>{"menu_items_attributes"=>{"0"=>{"product_attributes"=>{"id"=>"7"}, "price"=>"23", "_destroy"=>"0", "id"=>"30"}, "1532174157580"=>{"product_attributes"=>{"id"=>"3"}, "price"=>"999", "_destroy"=>"false", "id"=>""}, "1"=>{"product_attributes"=>{"id"=>"11"}, "price"=>"10", "_destroy"=>"0", "id"=>"31"}, "1532174166502"=>{"product_attributes"=>{"id"=>"10"}, "price"=>"666", "_destroy"=>"false", "id"=>""}}}, "menu_item_type"=>"foods", "menu_item_category"=>"desert", "menu_item_product"=>"10", "reset"=>"Reset", "commit"=>"Save", "controller"=>"admin/places", "action"=>"update", "id"=>"7"}

我尝试使用.reject(在docs中找到)遍历参数,但是没有运气。我想念什么?

1 个答案:

答案 0 :(得分:1)

现有菜单项:

params["place"]["menu_items_attributes"].select {|k, v| !v["id"].empty? }

新菜单项:

params["place"]["menu_items_attributes"].select {|k, v| v["id"].empty? }

我不知道您的情况,也许您想要这样:

ActiveRecord::Base.transaction do
  params["place"]["menu_items_attributes"].select {|k, v| v["id"].empty? }.values.each do |menu_item_param|
    MenuItem.create!(menu_item_param)
  end
end