#ruby-on-rails #forms #simple-form #nested-forms
Вопрос:
Объяснять:
- У меня есть
Artist
модель, у которой может быть несколько настроек, например, одна или несколько «Соло», «Дуэт», «Трио» или «Группа». - Существует
Artist
модель,ArtistSetup
модель иArtistSetupSelection
модель, которая соединяет эти два - Текущая форма представляет собой список флажков, в которых перечислены все настройки, которые создают или удаляют соединение
ArtistSetupSelection
в зависимости от того, установлено оно или нет, и выглядит следующим образом:
lt;%= simple_form_for @artist do |form| %gt; lt;%= form.input :artist_setup_ids, label: false, :as =gt; :check_boxes do %gt; lt;%= form.collection_check_boxes :artist_setup_ids, ArtistSetup.select_list, :id, :name do |b| %gt; lt;%= b.label %gt;amp;nbsp;amp;nbsp;lt;%= b.check_box %gt; lt;% end %gt; lt;% end %gt; lt;% end %gt;
- Как это работает в настоящее время,
artist_setup_selections
они сохраняются с помощью формы исполнителя, отправляяartist_setup_ids
параметры, а не фактически через вложенную форму
Передо мной была поставлена задача добавить в дополнение к этому систему, в которой для каждой настройки (Соло, Дуэт, Трио, группа) исполнитель может выбрать, как далеко он готов отправиться, и минимальную плату, которую он хотел бы получить за это расстояние. Существуют заданные расстояния в 25, 50, 100 и 100 (миль), поэтому, по сути, форма должна выглядеть следующим образом (просто макет, игнорируйте дизайн/четкость): (https://i.imgur.com/n3Lts5E.png)
что я сделал:
- Я добавил новую модель
distances
, в которой сохранены записи о расстоянии 25, 50, 100 и более 100 - Я добавил модель под названием
artist_distance_selections
которая принадлежитdistance
иartist_setup_selections
и имеетfee
столбец
Я прикрепил небольшую визуальную схему, чтобы сделать ее более понятной. (https://i.imgur.com/h1iqJyq.png)
По сути, я пытаюсь спросить, как создать двойную вложенную форму с флажками, которые могут создавать или удалять запись, если она отмечена/снята на обоих уровнях вложенности, а также отправлять плату на втором уровне. Одна из проблем заключается в том, что должны существовать флажки для полей, которые еще не существуют.
Это моя попытка:
исполнители/редактировать.html.erb
... lt;%= simple_form_for @artist do |form| %gt; lt;%= form.input :artist_setup_ids, label: false, :as =gt; :check_boxes do %gt; lt;%= form.collection_check_boxes :artist_setup_ids, ArtistSetup.all, :id, :name do |b| %gt; lt;%= b.label %gt;amp;nbsp;amp;nbsp;lt;%= b.check_box %gt; lt;% end %gt; lt;% end %gt; lt;% end %gt; lt;%= simple_form_for @artist do |form| %gt; lt;%= form.simple_fields_for :artist_setup_selections, ArtistSetupSelection.collection(current_user.account) do |f| %gt; lt;fieldsetgt; lt;%= f.simple_fields_for :artist_distance_selections, ArtistDistanceSelection.collection(f.object) do |fb| %gt; lt;%= fb.check_box :checked %gt; lt;%= fb.number_field :fee %gt; lt;% end %gt; lt;/fieldsetgt; lt;% end %gt; lt;% end %gt; ...
artist_setup_selection.erb
def self.collection(artist) setup_selections = artist.artist_setup_selections ArtistSetup.where('id NOT IN (?)', setup_selections.map(amp;:artist_setup).pluck(:id)).each do |setup| setup_selections lt;lt; ArtistSetupSelection.new(artist: artist, artist_setup: setup) end setup_selections.sort_by { |setup_selection| setup_selection.artist_setup.id } end
artist_distance_selection.erb
def self.collection(setup_selection) distance_selections = setup_selection.artist_distance_selections Distance.where('id NOT IN (?)', distance_selections.map(amp;:distance).pluck(:id)).each do |distance| distance_selections lt;lt; ArtistDistanceSelection.new(distance: distance, artist_setup_selection: setup_selection) end distance_selections.sort_by { |distance_selection| distance_selection.distance.id } end