Rails 5: вложенные параметры не вложены в has_many: through - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь создать форму в 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

1 Ответ

0 голосов
/ 15 сентября 2018

Вы должны включить accepts_nested_attributes_for :components в модель Order.

class Order < ApplicationRecord
  has_many :component_orders, dependent: :restrict_with_exception
  has_many :components, through: :component_orders
  accepts_nested_attributes_for :components
end

и изменить

<%= fields_for :components do |builder| %>

до

<%= f.fields_for :components do |builder| %>

чтобы получить желаемое params. accepts_nested_attributes_for :components создает метод, а именно components_attributes

Подробнее здесь

...