更新,解决方案是:
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中找到)遍历参数,但是没有运气。我想念什么?
答案 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