Отправка нескольких объектов одной и той же модели из одной формы

#ruby-on-rails #ruby-on-rails-4 #ruby-on-rails-5

#ruby-on-rails #ruby-on-rails-4 #ruby-on-rails-5

Вопрос:

Я хочу отправить несколько объектов (массив хэшей) одной и той же модели из одной формы. Мои параметры показывают только один объект, даже если я пытаюсь отправить более одного.

Мои параметры выглядят так:

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"adjbzaCNxfw==", "serialized_products"=>{"product_id"=>"2", "location_id"=>"1", "serial"=>"1234567890"}, "commit"=>"Save changes"}
  

Я ожидаю, что ключ в хэше параметров вызывается serialized_products с помощью массива сериализованных продуктов, таких как:

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"bbT3qiNZxFrO9RYLL3g==", "serialized_products"=>[{"product_id"=>"1", "location_id"=>"1", "serial"=>"2345454353454"}, {"product_id"=>"1", "location_id"=>"1", "serial"=>""}, {"product_id"=>"1", "location_id"=>"1", "serial"=>""}, {"product_id"=>"2", "location_id"=>"1", "serial"=>"454356536556"}, {"product_id"=>"2", "location_id"=>"1", "serial"=>""}], "commit"=>"Save changes"}
  

Я получаю эту ошибку при отправке формы:

undefined method 'permit' for "product_id":String Did you mean? print

До обновления до Rails 5 с Rails 4.2 все работало нормально.

У меня есть следующий код, адаптированный отсюда:

http://vicfriedman.github.io/blog/2015/07/18/create-multiple-objects-from-single-form-in-rails/

Форма:

 <%= form_tag serialized_products_path do %>
  <% @serialized_products.each do |product| %>
    <%= fields_for 'serialized_products[]', product do |p| %>

        <%= p.label :product_id %><br>
        <%= p.text_field :product_id %>

        <%= p.label :location_id %><br>
        <%= p.text_field :location_id %>

        <%= p.label :serial %><br>
        <%= p.text_field :serial %>

    <% end %>
  <% end %>

  <%= submit_tag %>

<% end %>
  

Контроллер SerializedProducts:

 class SerializedProductsController < ApplicationController
  before_action :set_serialized_product, only: [:show, :edit, :update, :destroy]

  def new
    if session[:reference] == nil or session[:location_id] == nil or session[:line_item_ids] == nil
      print "nnSession is nil.nn"
      redirect_back(fallback_location: root_path)
    end

    @reference = session[:reference]
    location_id = session[:location_id]
    @line_items = InventoryAdjustmentItem.where(id: session[:line_item_ids])
    @serialized_products = []
    @line_items.each do |line_item|
      (line_item.quantity).times do 
        @serialized_products.push(SerializedProduct.new(product_id: line_item.product_id, location_id: location_id))
      end
    end
  end

  def create
    params["serialized_products"].each do |serialized_product|
      if serialized_product["serial"].present?
        SerializedProduct.create(serialized_product_params(serialized_product))
      end
    end
    redirect_to :root, notice: 'Serialized product was successfully created.'
    session[:reference] = nil
    session[:location_id] = nil
    session[:line_item_ids] = nil
  end

  private
    def set_serialized_product
      @serialized_product = SerializedProduct.find(params[:id])
    end

    def serialized_product_params(my_params)
      my_params.permit(:product_id, :location_id, :serial)
    end
end
  

Комментарии:

1. Я рассмотрю это не то, что я изначально думал

2. Используйте accepts_nested_attributes и fields_for ассоциацию.

3. @max Какая ассоциация? Это та же модель.

4. можете ли вы вставить значение params["serialized_products"]