Знакомство с Active Scaffold

в 4:22, , рубрики: ruby on rails, интерфейсы, прототипирование, метки: , ,

Всем доброго дня! Я вам хочу поведать о замечательном геме (плагине) для Ruby and Rails (практически не нашёл упоминаний о нём на хабре).

Цель данного плагина — предоставить удобный типовой интерфейс «из коробки». С добавлением, удалением, правкой, поиском, сортировкой и всё это с ajax (или без него).

Знакомство с Active Scaffold

Делается такое чудо, как на рисунке, в несколько простых шагов:

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

В результате получится вот это:
Знакомство с Active Scaffold

ActiveScaffold дружит с I18n, так что русификация не должна вызвать затруднений:

ru:
  activerecord:
    models:
      stub:
        one: "Заглушка"
        few: "Заглушки"
        many: "Заглушки"
        other: "Заглушки"
    attributes:
      stub:
        name: "Название"
        value: "Значение"
        precise: "Точно"
        occurs: "Состоится"
        created_at: "Создано"
        updated_at: "Изменено"

Знакомство с Active Scaffold
Очень здорово, правда?

Также Active Scaffold умеет выводит сообщения об ошибках, если валидация модели провалилась или случилось что-то непоправимое с сервером.

Но это всё база. Самое главное: Active Scaffold отслеживает связи между моделями (сущностями) и умеет подгружать связанные записи. Вот так:
Знакомство с Active Scaffold

При этом плагин хорошо конфигурируется:

  • Можно задавать порядок и количество выводимых колонок (кроме колонок можно выводить методы модели), для создания, отображения и редактирования могут задаваться свои наборы атрибутов
  • Можно управлять сортировкой и фильтрацией
  • В зависимости от разных условий можно щедро раздавать CSS-классы различным записям
  • Можно создавать ссылки на свои действия в контроллере.
  • Можно включить чекбоксы и отмечать множество записей скопом (и скопом их обрабатывать) Примерно таким макаром.
  • Можно переопределять как отображаются значения различных колонок (обратите внимание на цветные квадратики):
    Знакомство с Active Scaffold
    Такой трюк делается так (в файле хелпера для нужного контроллера):

    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

* - обязательные к заполнению поля