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
Мои проблемы: РЕДАКТИРОВАТЬ: Решение по каждой точке
- Когда я загружаю страницы заказа, автоматически создаются поля пробелов для вложенных атрибутов ()
Неправильные nested_attributes в модели заказа:
accepts_nested_attributes_for **:order_products**, reject_if: :all_blank, allow_destroy: true
При отправке формы запись не создается. (но я могу добавить товар к заказу через консоль.ex: order.products << product1)
Когда я добавляю больше товаров по ссылке на добавление Cocoon, на контроллер отправляется только первое
- Не знаю, как реализовать Сильные Параметры и представления для атрибутов Ингредиента в форме Порядка
Получил это работает:
Модель ингредиента:
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>