Всем доброго дня! Я вам хочу поведать о замечательном геме (плагине) для Ruby and Rails (практически не нашёл упоминаний о нём на хабре).
Цель данного плагина — предоставить удобный типовой интерфейс «из коробки». С добавлением, удалением, правкой, поиском, сортировкой и всё это с ajax (или без него).
Делается такое чудо, как на рисунке, в несколько простых шагов:
1. Кидаем строчку в Gemfile
gem 'active_scaffold'
2. Устанавливаем gem'ы
bundle install
3. Подключаем стили и скрипты
/* В /app/assets/stylesheets/application.css.scss
*= require active_scaffold
*/
// В /app/assets/javascripts/application.js
//= require active_scaffold
4. Прописываем в целевом контроллере
class StuffsController < AuditorController
active_scaffold :stuff
end
Всё! Дальше Active Scaffold сам подхватит соответствующую модель (в примере — Stuff), разузнает о её колонках в таблице БД и связанных моделях, выберет 15 (по умолчанию) первых записей согласно настройкам default_scope в модели (если задано) и представит вам. Так же заодно (кроме отображения HTML) предоставит вам API в форматах JSON и XML.
Active Scaffold определяет генераторы active_scaffold и active_scaffold_controller, позволяющие, создавать модель+миграцию+контроллер+маршрут либо только один контроллер, соответственно. Примерно так:
rails generate active_scaffold stub name:string value:integer precise:decimal occurs:date
В результате получится вот это:
ActiveScaffold дружит с I18n, так что русификация не должна вызвать затруднений:
ru:
activerecord:
models:
stub:
one: "Заглушка"
few: "Заглушки"
many: "Заглушки"
other: "Заглушки"
attributes:
stub:
name: "Название"
value: "Значение"
precise: "Точно"
occurs: "Состоится"
created_at: "Создано"
updated_at: "Изменено"
Очень здорово, правда?
Также Active Scaffold умеет выводит сообщения об ошибках, если валидация модели провалилась или случилось что-то непоправимое с сервером.
Но это всё база. Самое главное: Active Scaffold отслеживает связи между моделями (сущностями) и умеет подгружать связанные записи. Вот так:
При этом плагин хорошо конфигурируется:
- Можно задавать порядок и количество выводимых колонок (кроме колонок можно выводить методы модели), для создания, отображения и редактирования могут задаваться свои наборы атрибутов
- Можно управлять сортировкой и фильтрацией
- В зависимости от разных условий можно щедро раздавать CSS-классы различным записям
- Можно создавать ссылки на свои действия в контроллере.
- Можно включить чекбоксы и отмечать множество записей скопом (и скопом их обрабатывать) Примерно таким макаром.
- Можно переопределять как отображаются значения различных колонок (обратите внимание на цветные квадратики):
Такой трюк делается так (в файле хелпера для нужного контроллера):module GroupsHelper def group_color_column(record) raw "<div style="background: #" + record.color + ";" class="group_color"></div>" end end
- Можно переопределять элементы формы. Для большинства случаев (пароль, список, …) есть уже готовые, смотреть в API:Column под заголовком form_ui.
- Можно задавать настройки и права доступа к каждой записи отдельно.
- И многое, многое другое…
Исходный код проекта доступен на github'е, там же, в вики, лежит отличная документация (хотя немного разрозненная и местами устаревшая). Если всё-равно что-то непонятно или что-то не работает — у проекта есть живая гуглогруппа, посмотрите или поспрашивайте там, вам помогут (но вы ведь точно перед этим посмотрите FAQ в документации, правда?)
Резюмируя
Плагин прекрасно подходит для прототипирования и создания простых интерфейсов, в случае если данных много и они однотипные (например много-много цифр). Так же хорош для различных админок и т.п.
Однако, если вам нужно что-то достаточно сложное — лучше пишите своё. Active Scaffold сложно настроить для обработки сложных форм, сложных представлений, работы с отношением многие-ко-многим, работы с хитро друг с другом связанными сущностями. Здесь лучше сразу написать своё.
На этом всё. Счастливой вам разработки и не тратьтесь на рутину понапрасну. Для неё и созданы такие потрясающие плагины. И не забывайте возвращать в open source. (Собственно, таким небольшим возвратом я сейчас здесь и занимался)
Автор: Envek