Сохранение нескольких записей в одной форме создания зависит от связанных элементов - PullRequest
0 голосов
/ 12 июня 2019

Цель: создать несколько заказов на основе количества определенных связанных записей.

Вот форма: (не важно, но получение ошибок

<%= form_for(@order) do |form| %>
    <%= form.hidden_field :cart_id, value: @cart.id %>
    <%= form.hidden_field :store_order_id, value: "1" %>
    <%= form.text_field :shipping_name %>
    <%= form.text_field :shipping_address1 %>
  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

Ошибка:

ActionView :: Template :: Error (Первый аргумент в форме не может содержать ноль или быть пустым):

Модель:

ShopProduct

has_one :order
has_many :line_items

Заказать

belongs_to :product, optional: true
belongs_to :shop_product, optional: true
belongs_to :cart

LineItem

belongs_to :shop_product, optional: true
belongs_to :product, optional: true
belongs_to :cart

Корзина

has_many :line_items, dependent: :destroy
has_one :order

OrdersController:

  def create
    cart = Cart.find(params["order"]["cart_id"])
    line_items = LineItem.where(cart_id: cart)
    shop_product_line_items = line_items.where.not(shop_product: [nil, ""])
    product_line_items = line_items.where.not(product: [nil, ""])
    shop_products = ShopProduct.find(shop_product_line_items.each { |li| li.shop_product })
    products = Product.find(product_line_items.each { |li| li.product })

    if shop_products.present?
      shop_products.each { |sp|
      @order = Order.new
      @order.shop_product_id = sp.id
      @order.product_id = sp.product_id
      @order.cart_id = cart
      @order.save!
    }
    end

    if products.present?
      products.each { |p|
      @order = Order.new
      @order.product_id = p.id
      @order.cart_id = cart
      @order.save!
    }
    end

    @orders = Order.where(cart_id: cart)

    respond_to do |format|
      if @orders.count == line_items.count
        session[:cart_id] = nil
        format.html { redirect_to @order, notice: 'Order was successfully created.' }
        format.json { render :show, status: :created, location: @order }
      else
        format.html { render :new }
        format.json { render json: @order.errors, status: :unprocessable_entity }
      end
    end
  end

Как это работает, есть тележка, которая затем прикрепляется ко многим line_items, которые могут быть shop_product или product. Затем я хочу сохранить отдельный заказ на основе каждого @cart.line_items.

Как я могу создать несколько ордеров на основе того, сколько line_items присутствует в корзине?

...