3 марта 2012 г.

Форма с чекбоксами и multiple select для модели с has_many связями на Rails 3

текст основан на вольном переводе статьи из блога Bucky Bits с авторскими дополнениями

В разработке сайтов довольно часто встречаются ситуации, когда к одной модели необходимо иметь возможность добавить одну или более опций из отдельного списка.

@товар может иметь много @категорий, а @магазин иметь отделения в разных @городах, при этом и @категории и @города являются отдельными ресурсами с чёткой и востребованной структурой - т.е. мы выбираем связи из предложенных вариантов.

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


Итак, основной моделью у нас будет @книга, а за пример списка возьмем модель @издательство. Чтобы создать их, выполните следующие команды (предполагается что приложение с базой данных уже создано и запущено, перейдите в командной строке в его директорию):



Обратите внимание на третью строчку в этом коде, это третья вспомогательная модель для записи отношений книг и издательств. Первые две модели генерируются через scaffold, чтобы мы имели готовую основу для записи, отображения, изменения и удаления этих сущностей. Добавим необходимые указания в сгенерированные модели:


Описав связи и валидации, приступим к форме создания, но сначала перейдите в браузере по адресу "ваш сайт"/pubhouses/new и создайте 3-4 примера издательств, к которым мы сможем привязать наши книги. После этого откройте файл 'app/views/books/_from.html.erb'. Как видите, это шаблон нашей формы, используемый при создании и редактировании книг. Далее привожу два варианта, выберите тот что вас интересует:

Издательства отмечаются чекбоксами:

Издательства отмечаются в списке с мультивыбором:


Ну вот и всё! В контроллере не нужно отдельно прописывать сохранение каких либо моделей кроме основной - book, т.е. все связи самостоятельно создадутся по введённым в форму данным.

Это моя первая развернутая статья, надеюсь вам было интересно прочитать её. Ваши вопросы и пожелания оставляйте в комментариях. Успехов в разработке!

1 комментарий: