Как создать форму для вложенного ресурса с has_many через ассоциацию? - PullRequest
0 голосов
/ 21 апреля 2019

У меня проблемы с созданием правильного синтаксиса form_with для создания записи для has_many посредством ассоциации, и я не могу найти пример для копирования.

В моей модели есть фабрика.Фабрики могут иметь оборудование.Оборудование может иметь много вариантов оборудования.Вариации относятся к конкретному типу оборудования, но различаются для каждого конкретного элемента оборудования (поэтому VariationType связан с EquipmentType)

Я могу создать фабрику (например, localhost / factory / 1). Я могусоздать оборудование на заводе (например, localhost / factory / 1 / equipment / 1)

Но мне не удается создать форму, которая создает Варианты оборудования.То есть, когда я перехожу к localhost / factory / 1 / equipment / 1, мне нужна форма для добавления Вариантов Equipment в эту запись Equipment.

Вот мой код:

rout.rb

    resources :factories do
        resources :equipment do
            resources :equipment_variations
        end
    end

    resources :equipment_types do
        resources :variation_types
    end

Models

class Factory < ApplicationRecord
    has_many :equipment
end

class Equipment < ApplicationRecord
    belongs_to :factory
    belongs_to :equipment_type
    has_many :equipment_variations
    has_many :variation_types, through: :equipment_variations
end

class EquipmentVariation < ApplicationRecord
  belongs_to :equipment
  belongs_to :variation_type
end

class VariationType < ApplicationRecord
    belongs_to :equipment_type
    has_many :equipment_variations
    has_many :equipment, through: :equipment_variations
end

И представление в app / views / equipment / show.html.erb

<h1><%= @equipment.equipment_type.name %></h1>

<h3>Add Variation</h3>
<%= form_with(model: [@equipment, VariationType.new], url: factory_equipment_equipment_variations_path, local: true) do |form| %>

<%= form.submit %>

<% end %>

Это настолько близко, насколько мне удалось, но выдает ошибку: Нет совпадений маршрутов {: action => "index",: controller => "equipment_variations",:factory_id => "2",: id => "3"}, пропущены обязательные ключи: [: equipment_id]

В основном мне нужно иметь возможность публиковать сообщения на URL / factory / 1 / equipment / 1/ equipment_variations со страницы в / фабрики / 1 / оборудование / 1.Для этого указан маршрут factory_equipment_equipment_variations, поэтому я указал это в параметре url, но я считаю, что должен быть более простой способ добиться этого.Как должны выглядеть параметры form_with?

1 Ответ

0 голосов
/ 22 апреля 2019

Хорошо, я понял это. Я был близок, но правильный синтаксис выглядит следующим образом

<%= form_with(model: [@factory, @equipment, EquipmentVariation.new], local: true) do |form| %>

Итак, вам нужно указать модель: указать все модели для маршрута (фабрика, оборудование), и он сам определит правильный путь и предоставит параметры соответствующим образом.

Кроме того, мой контроллер для EquipmentVariation, вызываемый выше, выглядит так:

def create
        @equipment = Equipment.find(params[:equipment_id])
        @equipment.variation_types << VariationType.find(params[:variation_type][:variation_type_id])
    end

Надеюсь, это поможет кому-то в будущем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...