Я отправляю форму со следующими проблемами:
Параметры, которые не заполнены and
Не найдены связанные атрибуты модели, которые были переданы.
Форма:
...
<% PrintLocation.all.each.with_index do |print_location, index| %>
<%= print_location.title %>
<%= f.fields_for :shop_product_print_files_attributes, index: index, multiple: true do |a| %>
<%= a.text_field :print_file %>
<%= a.hidden_field :print_location_id, value: print_location.id %>
<%= a.hidden_field :shop_product_id, value: shop_product.id %>
<% end %>
<% end %>
...
Передача параметров:
, "shop_product_print_files_attributes"=>{"0"=>{"print_file"=>"a", "print_location_id"=>"1", "shop_product_id"=>"45"}, "1"=>{"print_file"=>"", "print_location_id"=>"2", "shop_product_id"=>"45"}, "2"=>{"print_file"=>"", "print_location_id"=>"3", "shop_product_id"=>"45"}, "3"=>{"print_file"=>"", "print_location_id"=>"4", "shop_product_id"=>"45"}, "4"=>{"print_file"=>"", "print_location_id"=>"5", "shop_product_id"=>"45"}, "5"=>{"print_file"=>"", "print_location_id"=>"6", "shop_product_id"=>"45"}},
Модель:
class ShopProductPrintFile < ApplicationRecord
belongs_to :shop_product
belongs_to :print_location
end
class PrintLocation < ApplicationRecord
has_many :shop_products, through: :shop_product_print_files
has_many :shop_product_print_files
accepts_nested_attributes_for :shop_product_print_files
end
class ShopProduct < ApplicationRecord
...
has_many :shop_product_print_files
has_many :print_locations, through: :shop_product_print_files
accepts_nested_attributes_for :shop_product_print_files
end
Контроллер:
def new
@shop_product = ShopProduct.new
@shop_product.shop_product_print_files.build
end
def create
@shop_product = ShopProduct.new(shop_product_params)
@shop_product.shop_product_print_files.build(print_location_id: params["shop_product"]["shop_product_print_files_attributes"]["print_location_id"])
shop = Shop.find(params["shop_product"]["shop_id"])
product = Product.find(params["shop_product"]["product_id"])
@shop_product.product_id = product.id
@shop_product.shop_id = shop.id
respond_to do |format|
if @shop_product.save!
...
end
end
def update
@shop_product = ShopProduct.find_by(store_variant_id: params["shop_product"]["store_variant_id"])
@shop_product.shop_product_print_files.build(shop_product_id: @shop_product.id, print_location_id: params["shop_product"]["shop_product_print_files_attributes"]["print_location_id"])
@product = Product.find(params["shop_product"]["product_id"])
respond_to do |format|
if @shop_product.update(shop_product_params)
...
end
end
private
def shop_product_params
params.require(:shop_product).permit(...., :shop_product_print_files_attributes => [:id, :print_file, :print_location_id, :shop_product_id])
end
Ошибка:
Shop product print files print location must exist
Самая большая проблема в том, что print_location не найден, но почему бы и нет?
Кроме того, почему посылаются все параметры, даже если print_file
пусто?
Раньше я не использовал each.with_index
и не использовал index: index
в форме. При этом форма будет отправлять и создавать shop_product_print_files
, но проблема заключается в том, что она будет передавать только последнее значение в цикле PrintLocation, "6"
и 1-5
будут аннулированы. когда я установил использование индексного кода, все прошло, но ВСЕ прошло и не было сохранено с ошибкой, упомянутой выше.
Что я могу сделать, чтобы пройти только те параметры, которые не являются пустыми, и найти их?