RESTful способ сделать разлагаемые несколько моделей в форме в Rails - PullRequest
1 голос
/ 16 января 2009

Пока что мне не удалось найти решение, которое позволило бы форме взаимодействовать с двумя моделями, имеющими отношение один ко многим. Скажем, например, у клиента много товаров.

В настоящее время я реализовал решения, использующие Javascript, который позволяет пользователям добавлять / удалять строки в списке элементов. Давайте будем проще, мы создаем новые записи здесь.

Чтобы улучшить это до степени разложения, я вместо этого создал кнопку «Добавить элемент», которая фиксирует другое значение, так что в моем действии создания я могу захватить новые атрибуты и добавить новый элемент в объект клиента.

Однако, поскольку элемент новый и не имеет идентификатора, я не могу удалить конкретный элемент. Я думал об использовании индексов и добавлении кнопок / ссылок для удаления, но это делает все беспорядочным, и я не могу использовать свою частичку для коллекций. Так что я чувствую, что это хак; есть ли лучшая альтернатива?

Ответы [ 2 ]

1 голос
/ 12 октября 2009

Вы хотите использовать accepts_nested_attributes_for. В эпизоде ​​Railscasts, о котором упоминал Генриклоевборг, рассказывается о методе такого рода вещей, который был устаревшим методом accepts_nested_attributes_for.

Вы можете сделать это без accept_nested_attributes_for. Что может быть необходимо, если вы не хотите обновляться до Rails 2.3.

В вашем javascript для удаления элемента вы должны добавить в форму скрытое поле с именем _delete со значением true. Тогда в вашем контроллере. Игнорируйте все новые записи с полем _delete и уничтожайте любые существующие.

Все, что встроено в accept_nested_attributes_for

Поиграйтесь с кодом в complex-forms-exmample github хранилище. По сути, это код из Railscast # 75, обновленный для использования более новой функции accepts_nested_attributes_for.

Вы заметите, что он не использует RJS для выполнения динамического добавления / удаления записей. Также по сравнению с тем, что вы делали, оно создается при отправке, а не во время удаленного вызова. Автоматическое добавление / удаление элементов обрабатывается с помощью тегов content_for для создания шаблона, хранящегося в функции javascript, и библиотеки Prototype для изменения скрытого поля, которое accepts_nested_attributes_for использует для уничтожения объектов, которые вы хотите удалить.

1 голос
/ 16 января 2009

Railscasts Episode # 75 именно об этом, если я правильно понимаю ваш вопрос.

Я считаю, что он создает элементы и затем помечает их для удаления, если пользователь сожалеет о создании этих элементов.

imo, это лучший способ справиться с проблемой, и есть советы по проверке.

...