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

Если вы хотите сделать это вручную, вот план:

  1. Вам не нужно отправлять запрос AJAX для создания экземпляров вложенных моделей (что происходит, когда пользователь нажимает кнопку добавления нового экземпляра и закрывает вкладку браузера? Экземпляр остается в БД)

  2. Используйте всю мощь вложенных атрибутов Rails - это позволяет вам создавать родительские и дочерние модели одним движением, одним движением create или же save позвонить по родительской модели.

  3. Поэтому все, что вам нужно сделать в JS - это создать 2 кнопки, одна из которых добавляет несколько новых полей, а другая удаляет их. Просто HTML, без AJAX звонков.

  4. Чтобы использовать вложенные атрибуты, вы должны придерживаться определенных соглашений при создании параметров для Parent.create или же save, Обычно, когда вы создаете модель, вы передаете некоторые атрибуты create Метод, эти атрибуты соответствуют полям модели. Когда вы используете вложенные атрибуты, вам нужно передать один дополнительный атрибут, который формируется следующим образом: [children_relation_name]_attributes, Так что если у вас есть Project а также Task модель и вы хотите создать проект и задачи одновременно, вам нужно создать их так:

    Project.create (name: 'Project 1', tasks_attributes: [{name: 'Task 1'}, {name: 'Task 2'}])

(не обращайте внимания на идентификаторы для задач - Rails назначит их автоматически)

  1. Все вышеперечисленное работает только в том случае, если Parent модель имеет has_many :children а также accepts_nested_attributes_for :children

  2. Итак, ваша задача - просто создать правильные параметры, которые включают children_attributes параметр, добавьте этот параметр в сильные параметры (например, так children_attributes: [:name, :age, ...]). Ты используешь form_for а также fields_for для построения формы, JS для правильного размещения полей в этой форме, вложенные атрибуты для одновременного создания родительских и дочерних записей. И это то, что cocoon драгоценный камень делает.

Что касается документации по Rails, она довольно хорошая и в основном всеобъемлющая. Да, никто не идеален и могут быть некоторые пробелы, но нет ничего лучше, чем эта документация. Вы также можете ссылаться на код Rails, но это гораздо сложнее, чем просто читать документацию.

Другие вопросы по тегам