В настоящее время у меня есть поставщик, к которому может быть прикреплено любое количество тегов.Однако я также хочу, чтобы пользователь мог добавлять дополнительные теги в форму.Ранее я делал это с fields_for
и текстовыми полями в форме и accepts_nested_attributes
в контроллере, но это приводило к дублированию тегов, когда тег с одинаковым именем добавлялся двум разным поставщикам.Я знаю, что это произошло потому, что каждый поставщик мог видеть только те теги, которыми он обладал, поэтому он не знал идентификаторы других тегов.
Теперь я переключился на select
, в котором перечислены все возможные теги.и передайте список идентификаторов владения контроллеру.Однако я больше не могу добавлять новые теги, так как не может найти идентификаторы новых тегов, если они не были добавлены в базу данных первыми.Кажется, я не могу использовать fields_for
для создания параметров в select
, поэтому я застрял на том, как справиться с этим.Я рассмотрел использование AJAX для создания тега, используя параметр remote: true
внутри form_for
, но кажется, что формы внутри форм не поддерживаются.
Вот основные отношения модели:
class Vendor < ActiveRecord::Base
has_many :vendor_ownerships
has_many :ownerships, through: :vendor_ownerships
end
class Ownership < ApplicationRecord
has_many :vendor_ownerships
has_many :vendors, through: :vendor_ownerships
end
class VendorOwnership < ApplicationRecord
belongs_to :vendor
belongs_to :ownership
end
Вот моя форма частичная (упрощенная).В настоящее время он пытается использовать вложенные формы, но не работает.
= form_for @vendor do |f|
#form_elements_div
.form_group.element_div
= f.label :name
= f.text_field :name
#ownerships.element_div
= f.collection_select :ownership_ids, Ownership.all, :id, :name, {}, {multiple: true}
#new_ownerships.element_div
-# How do I add the new tag/ownership here?
= form_for :ownership, url: ownerships_path, remote: true do |ff|
= ff.text_field :new_ownership_field
= ff.submit
#submit_div.form_group
= f.submit class: 'btn btn-success'
Теоретически, вложенная форма для добавления нового тега вызовет действие контроллера create
внутри модели Ownership
, ноКнопка отправки для этой формы всегда вызывает create
для внешней Vendor
модели.
Редактировать: вот HTML-тело, созданное в настоящее время моим кодом.
<body>
<body id='vendorsBody'>
<div id='form_div'>
<h2>Edit Vendor</h2>
<form class="edit_vendor" id="edit_vendor_1" action="/vendors/1" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="✓" />
<input type="hidden" name="_method" value="patch" />
<input type="hidden" name="authenticity_token" value="PzG968HknJ5wCYt37g7RL8J4/00rmcnIO6T02owt5HBh9FUsXfWd00WZW1k/vM+o4RktfbKPBEcWk4BdCfYnhg==" />
<div id='form_elements_div'>
<div class='form_group element_div'>
<label for="vendor_name">Name</label>
<input type="text" value="Vendor 1" name="vendor[name]" id="vendor_name" />
</div>
<div class='element_div' id='ownerships'>
<input name="vendor[ownership_ids][]" type="hidden" value="" />
<select multiple="multiple" name="vendor[ownership_ids][]" id="vendor_ownership_ids">
<option selected="selected" value="1">Type 1</option>
<option selected="selected" value="2">Type 2</option>
<option selected="selected" value="3">Type 3</option>
</select>
</div>
<div class='element_div' id='new_ownerships'>
<form action="/ownerships" accept-charset="UTF-8" data-remote="true" method="post">
<input name="utf8" type="hidden" value="✓" />
<input type="text" name="ownership[new_ownership_field]" id="ownership_new_ownership_field" />
<input type="submit" name="commit" value="Save Ownership" data-disable-with="Save Ownership" />
</form>
</div>
<div class='form_group' id='submit_div'>
<input type="submit" name="commit" value="Update Vendor" class="btn btn-success" data-disable-with="Update Vendor" />
<button class='btn btn-danger' id='cancel_button' onclick='confirmVendorCancel()' type='button'>Cancel</button>
</div>
</div>
</form>
</div>
</body>
</body>