Rails: расширенное использование FormBuilder
Я работаю над нашим веб-приложением, и на прошлой неделе в мою задачу входила реализация вложенной формы, имеющей функцию удаления динамических полей (из связанной дочерней модели). Обратите внимание, что форма реализует две модели с отношением один ко многим. Я исследовал это и обнаружил различные способы, некоторые из них добавляют / удаляют поля без js, в то время как другие используют js по-старому (rails 3 или ранее). Я следовал за Railscast-196 и Railscast-197, но объясненный способ вспомогательного метода не является ненавязчивым, не так ли? (потому что он все еще использует JS в HTML)
Я ищу способ реализовать функцию добавления / удаления через JQuery ненавязчивым способом.
По логике это должно быть возможно с помощью - создания ajax-запроса для создания экземпляра вложенной модели, - ответа путем построения на стороне сервера с помощью jquery, - обновления представления и последующей отправки отправленного обновленного представления клиенту.
Проблемы: - Проблема, с которой я сталкиваюсь, заключается в передаче объекта компоновщика в jquery. Ожидание: - Связывание двух пользовательских функций добавления и удаления полей с кнопками в представлении через jquery.
ДОПОЛНИТЕЛЬНО: Не могли бы вы дать мне ссылку на более подробную документацию к FormBuilder? Потому что API Rubyonrails не достаточно объяснить. Они даже не говорят, что, если вы используете form_builder.object, вы получите модель (явным образом), что позволит Райанбу использовать FormBuilder "f.object.class.reflect_on_association".
1 ответ
Существует драгоценный камень, который точно делает то, что вы пытаетесь реализовать: https://github.com/nathanvda/cocoon
Если вы хотите сделать это вручную, вот план:
Вам не нужно отправлять запрос AJAX для создания экземпляров вложенных моделей (что происходит, когда пользователь нажимает кнопку добавления нового экземпляра и закрывает вкладку браузера? Экземпляр остается в БД)
Используйте всю мощь вложенных атрибутов Rails - это позволяет вам создавать родительские и дочерние модели одним движением, одним движением
create
или жеsave
позвонить по родительской модели.Поэтому все, что вам нужно сделать в JS - это создать 2 кнопки, одна из которых добавляет несколько новых полей, а другая удаляет их. Просто HTML, без AJAX звонков.
Чтобы использовать вложенные атрибуты, вы должны придерживаться определенных соглашений при создании параметров для
Parent.create
или жеsave
, Обычно, когда вы создаете модель, вы передаете некоторые атрибутыcreate
Метод, эти атрибуты соответствуют полям модели. Когда вы используете вложенные атрибуты, вам нужно передать один дополнительный атрибут, который формируется следующим образом:[children_relation_name]_attributes
, Так что если у вас естьProject
а такжеTask
модель и вы хотите создать проект и задачи одновременно, вам нужно создать их так:Project.create (name: 'Project 1', tasks_attributes: [{name: 'Task 1'}, {name: 'Task 2'}])
(не обращайте внимания на идентификаторы для задач - Rails назначит их автоматически)
Все вышеперечисленное работает только в том случае, если
Parent
модель имеетhas_many :children
а такжеaccepts_nested_attributes_for :children
Итак, ваша задача - просто создать правильные параметры, которые включают
children_attributes
параметр, добавьте этот параметр в сильные параметры (например, такchildren_attributes: [:name, :age, ...]
). Ты используешьform_for
а такжеfields_for
для построения формы, JS для правильного размещения полей в этой форме, вложенные атрибуты для одновременного создания родительских и дочерних записей. И это то, чтоcocoon
драгоценный камень делает.
Что касается документации по Rails, она довольно хорошая и в основном всеобъемлющая. Да, никто не идеален и могут быть некоторые пробелы, но нет ничего лучше, чем эта документация. Вы также можете ссылаться на код Rails, но это гораздо сложнее, чем просто читать документацию.