У меня нет веб-источника, который документирует то, что я обычно делаю, но я создал гист , который документирует то, что я делаю здесь чаще всего: https://gist.github.com/900241
Суть в том, что у вас есть модель проекта с множеством ролей проекта, и вы хотите отредактировать множество ролей проекта в форме проекта. Это в значительной степени классический сценарий accepts_nested_attributes_for
, и практически любая страница, которая о нем говорит, даст вам достойную рецензию. Проблема в том, что решения, которые я видел, всегда включали в себя какой-то серьезно грязный навязчивый JavaScript, который ускользал от всего представления формы и добавлял его в метод ссылки onClick. Недавно я предложил более чистый и ненавязчивый подход с использованием шаблонов jQuery.
Вам не нужно ничего делать с вашим ProjectsController, когда вы переходите к вложенной модели. Все просто работает на уровне контроллера, и вам даже не нужен ProjectRolesController. (Вот почему я не удосужился включить их в суть.) На уровне модели это просто стандарт accepts_nested_attributes_for
. Где это становится интересным, в представлении.
Форма проекта имеет два блока form_for: один отображает шаблон jQuery, а другой - форму ролей проекта. Шаблон jQuery, в свою очередь, просто отображает форму ролей проекта (mmm DRY!), Но внутри тега <script>
и с пустой ролью проекта. Поскольку форма находится внутри тега скрипта, она не будет отправлена вместе с формой проекта, а поскольку тип скрипта - "text / x-jquery-tmpl", это полностью допустимая разметка.
Когда пользователь нажимает «Добавить роль проекта», он запускает некоторый jQuery, который принимает форму в шаблоне, заменяет индекс на текущую дату (это все, чтобы эта роль проекта могла быть однозначно идентифицирована), и добавляет это до конца раздела ролей проекта формы.
Когда пользователь нажимает «Удалить» рядом с ролью проекта, он проверяет, является ли эта роль проекта новой записью, а если нет, то добавляет скрытое поле «_delete» в конец формы. В любом случае он удаляет div роли проекта из DOM.