Rails 5 имеет много сквозного с вложенной формой и коконом

Solverd: см. Внизу

Я строю систему заказов для многих продуктов, с HBTM от Join Table до anotherModel, но у меня есть некоторые проблемы при создании и редактировании новой записи вложенной формы.

Я пробовал много решений из других вопросов и следовал некоторому учебнику как этот или это, но ничто не решало мои проблемы.

Модель продукта:

class Product < ApplicationRecord
  belongs_to :subcategory

  has_many :order_products, inverse_of: :product
  has_many :order, :through => :order_products
end

Модель заказа:

class Order < ApplicationRecord
  has_many :order_products, inverse_of: :order
  has_many :products, :through => :order_products

  accepts_nested_attributes_for :products, reject_if: :all_blank, allow_destroy: true
end

Присоединиться к таблице:

class OrderProduct < ApplicationRecord
  belongs_to :order
  belongs_to :product

  has_and_belongs_to_many :ingredients
  accepts_nested_attributes_for :ingredients, reject_if: :all_blank, allow_destroy: true    
end

Модель ингредиентов, связанная с таблицей соединений: (многие ко многим, чтобы сохранить добавленные ингредиенты для каждого продукта в заказе)

class Ingredient < ApplicationRecord
  has_and_belongs_to_many :order_products
end

Контроллер заказов:

  # GET /orders/new
  def new
    @order = Order.new
  end

  # GET /orders/1/edit
  def edit
  end

  # POST /orders
  # POST /orders.json
  def create
    @order = Order.new(order_params)

    respond_to do |format|
      if @order.save
        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

    def order_params
      params.require(:order).permit(:subtotal, :discount, :total,
      order_products_attributes: [[:id, :order_id, :product_id , :_destroy]])
    end

Просмотры:

<%= simple_form_for(@order) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :subtotal %>
    <%= f.input :discount %>
    <%= f.input :total %>
  </div>

  <%= f.simple_fields_for :order_products do |o| %>
      <%= render 'order_product_fields', f: o %>
  <% end %>

  <%= link_to_add_association "aggiungi prodotto", f, :order_products %>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

Частично: (невозможно добавить ссылку на уничтожение кокона: неопределенный метод 'refle_on_association' для NilClass: Класс из-за автоматического добавления пустых полей)

<div class="nested-fields order-product-fields">
  <%= f.input :product %>
  <%= f.input :order %>

  <%= f.check_box :_destroy %>

</div>

Я получаю это на консоли:

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"PRNzrnxk/jrsAyPK5OzFxix2hIUmjCeWpD8Fkuhuhx8Wp3/xYTbTTvsfQkhnMDEBNnC/iNL46kl68XR7skb03g==", "order"=>{"subtotal"=>"", "discount"=>"", "total"=>"", "order_products"=>{"product"=>"", "order"=>"", "_destroy"=>"0"}}, "commit"=>"Create Order"}
Unpermitted parameter: order_products

Мои проблемы: РЕДАКТИРОВАТЬ: Решение по каждой точке

  1. Когда я загружаю страницы заказа, автоматически создаются поля пробелов для вложенных атрибутов ()

Неправильные nested_attributes в модели заказа:

accepts_nested_attributes_for **:order_products**, reject_if: :all_blank, allow_destroy: true
  1. При отправке формы запись не создается. (но я могу добавить товар к заказу через консоль.ex: order.products << product1)

  2. Когда я добавляю больше товаров по ссылке на добавление Cocoon, на контроллер отправляется только первое

  3. Не знаю, как реализовать Сильные Параметры и представления для атрибутов Ингредиента в форме Порядка

Получил это работает:

Модель ингредиента:

has_many :ingredient_order_products, inverse_of: :ingredient
has_many :order_products, :through => :ingredient_order_products

Модель IngredientOrderProduct:

  belongs_to :ingredient
  belongs_to :order_product

Заказать модель продукта:

  has_many :ingredient_order_products, inverse_of: :order_product
  has_many :ingredients, :through => :ingredient_order_products
  accepts_nested_attributes_for :ingredient_order_products, reject_if: :all_blank, allow_destroy: true

Контроллер заказов:

def order_params
  params.require(:order).permit(:customer_id, :subtotal, :discount, :total,
  order_products_attributes: [[:id, :order_id, :product_id, :qty, :gift, :_destroy,
    ingredient_order_products_attributes: [:id, :order_id, :ingredient_id, :_destroy]]])
end

_order_product_fields Частично:

  <div id="ingredient">
    <%= f.simple_fields_for :ingredient_order_products do |ingredient| %>
      <%= render 'ingredient_order_product_fields', f: ingredient %>
    <% end %>
    <%= link_to_add_association "Aggiungi Ingrediente", f, :ingredient_order_products %>
  </div>

0 ответов

Другие вопросы по тегам