поля_для формы с_индексом не найден параметр - PullRequest
1 голос
/ 15 июня 2019

Я отправляю форму со следующими проблемами:

Параметры, которые не заполнены 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 будут аннулированы. когда я установил использование индексного кода, все прошло, но ВСЕ прошло и не было сохранено с ошибкой, упомянутой выше.

Что я могу сделать, чтобы пройти только те параметры, которые не являются пустыми, и найти их?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...