Я пытаюсь создать форму в Rails 5.2 для модели с отношением has_many :through
к другой модели. Форма должна включать вложенные атрибуты для другой модели. Тем не менее, параметры не вкладываются должным образом. Я создал следующий минимальный пример.
Вот мои модели:
class Order < ApplicationRecord
has_many :component_orders, dependent: :restrict_with_exception
has_many :components, through: :component_orders
accepts_nested_attributes_for :components
end
class Component < ApplicationRecord
has_many :component_orders, dependent: :restrict_with_exception
has_many :orders, through: :component_orders
end
class ComponentOrder < ApplicationRecord
belongs_to :component
belongs_to :order
end
Каждая из моделей Component
и Order
имеет один атрибут: :name
.
Вот мой код формы:
<%= form_with model: @order do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= fields_for :components do |builder| %>
<%= builder.label :name %>
<%= builder.text_field :name %>
<% end %>
<%= f.submit %>
<% end %>
Когда я заполняю форму, я получаю следующие параметры:
{"utf8"=>"✓", "authenticity_token"=>"ztA1D9MBp1IRPsiZnnSAIl2sEYjFeincKxivoq0/pUO+ptlcfi6VG+ibBnSREqGq3VzckyRfkQtkCTDqvnTDjg==", "order"=>{"name"=>"Hello"}, "components"=>{"name"=>"World"}, "commit"=>"Create Order", "controller"=>"orders", "action"=>"create"}
В частности, обратите внимание, что вместо такого параметра, как это:
{
"order" => {
"name" => "Hello",
"components_attributes" => {
"0" => {"name" => "World"}
}
}
}
На том же уровне есть отдельные клавиши для "заказа" и "компонентов". Как я могу заставить эти атрибуты правильно вкладываться? Спасибо!
РЕДАКТИРОВАТЬ: Вот мой код контроллера:
class OrdersController < ApplicationController
def new
@order = Order.new
end
def create
@order = Order.new(order_params)
if @order.save
render json: @order, status: :created
else
render :head, status: :unprocessable_entity
end
end
private
def order_params
params.require(:order).permit(:name, components_attributes: [:name])
end
end