Статьи

Простые административные интерфейсы с активным администратором в Rails

функции

Администрирование приложений является распространенным требованием в большинстве веб-приложений, и его создание с нуля может быть сложной задачей. Однако есть некоторые опции, которые могут спасти вас от начала с нуля при создании интерфейса администратора. Мы рассмотрим один из популярных вариантов — Active Admin .

Active Admin — это структура для построения интерфейсов в стиле администрирования. Без особых усилий вы можете создать интерфейс администратора, который позволит вам управлять вашими данными, и он легко настраивается. Мы рассмотрим, как настроить и настроить его в приложении на Rails 4.

Следует отметить, что на момент написания этого руководства еще не было официального выпуска, поддерживающего Rails 4 (версия 1.0.0, которая находится в разработке, будет поддерживать Rails 4). Сейчас вам придется использовать основную ветку. Кроме того, сопровождающие репозитория Active Admin Github предупреждают, что документация на официальном веб-сайте устарела, и для получения последних документов вам следует проверить саму страницу репозитория Github .

Установка и настройка

Для этого урока я создал три модели.

rails g model Genre name:string rails g model Author first_name:string last_name:string rails g model Book name:string price:decimal author:references genre:references rake db:migrate 

Модели имеют следующие ассоциации.

app/models/genre.rb

 class Genre < ActiveRecord::Base has_many :books end 

app/models/author.rb

 class Author < ActiveRecord::Base has_many :books end 

app/models/book.rb

 class Book < ActiveRecord::Base belongs_to :author belongs_to :genre end 

Чтобы настроить Active Admin, добавьте драгоценный камень в свой Gemfile. Для поддержки Rails 4 на данный момент мы отслеживаем master.

 gem 'activeadmin', github: 'gregbell/active_admin' 

Затем установите его.

 bundle install 

Запустите генератор для установки Active Admin. Это создаст модель AdminUser , файл инициализатора для настройки Active Admin и каталог app/admin котором будут храниться файлы администрирования. Он использует Devise для аутентификации.

 rails g active_admin:install 

Если вы уже настроили модель AdminUser , вы можете вместо этого запустить следующую, которая будет использовать существующую модель AdminUser .

 rails g active_admin:install AdminUser 

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

Далее запустите миграцию.

 rake db:migrate 

Запустите сервер и перейдите по адресу http: // localhost: 3000 / admin . Вы должны быть в состоянии войти, используя следующее:

 Username: admin@example.com Password: password 

После входа в систему отображается панель администратора. Вверху находится меню, показывающее модели, которые были зарегистрированы в Active Admin. На данный момент, только модель AdminUser была зарегистрирована. Вы можете просматривать список зарегистрированных администраторов, редактировать их информацию и создавать новых.

Создание пользователей-администраторов

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

Измените форму, используемую для создания пользователей с app/admin/admin_user.rb администратора в app/admin/admin_user.rb чтобы она содержала только поле электронной почты.

 form do |f| f.inputs "Admin Details" do f.input :email end f.actions end 

Теперь разрешите создание администратора без пароля, добавив следующее в файл app/models/admin_user.rb .

 after_create { |admin| admin.send_reset_password_instructions } def password_required? new_record? ? false : super end 

Требуется password_required? Метод проверяет, создается ли запись в первый раз, и возвращает false, если это так, что позволяет создать администратора без пароля. Метод after_create отправляет письмо на зарегистрированный адрес электронной почты со ссылкой для установки пароля. Это уже было установлено Devise, так как по умолчанию Devise был установлен с rememberable субмодулем. (Это то же самое электронное письмо, которое отправляется, когда администратор пытается восстановить свой пароль по ссылке «Забыли пароль». Вы можете изменить шаблон сообщения по умолчанию, чтобы он соответствовал как изменению пароля, так и настройке пароля).

Если вы не определили параметры URL по умолчанию в своих файлах среды, отправка электронной почты не удастся. Поскольку мы находимся в разработке, включите в файл config/environments/development.rb .

 config.action_mailer.default_url_options = { :host => 'localhost:3000' } 

Конечно, вам нужно настроить почтовую программу для отправки электронного письма. Это выходит за рамки данного руководства, но вы можете проверить документацию Action Mailer, чтобы узнать, как отправлять электронные письма в приложении Rails. Даже не настроив Action Mailer для доставки электронной почты, мы можем просматривать содержимое электронной почты на терминале. Вы можете найти URL ссылки смены пароля в сообщении электронной почты, скопировать и вставить его в браузер, чтобы проверить, работает ли он.

Настройка видов

Зарегистрируйте наши три модели:

 rails generate active_admin:resource Genre rails generate active_admin:resource Author rails generate active_admin:resource Book 

Я заполнил базу данных некоторыми данными, поместив следующее в файл db/seeds.rb и запустил rake db:seed

 ya = Genre.create! :name => "Young Adult" humor = Genre.create! :name => "Humor" gnovel = Genre.create! :name => "Graphic Novel" crime = Genre.create! :name => "Crime" fantasy = Genre.create! :name => "Fantasy" business = Genre.create! :name => "Business and Finance" collins = Author.create! :first_name => "Suzanne", :last_name => "Collins" kaling = Author.create! :first_name => "Mindy", :last_name => "Kaling" handler = Author.create! :first_name => "Chelsea", :last_name => "Handler" ohba = Author.create! :first_name => "Tsugumi", :last_name => "Ohba" oda = Author.create! :first_name => "Eiichiro", :last_name => "Oda" grisham = Author.create! :first_name => "John", :last_name => "Grisham" patterson = Author.create! :first_name => "James", :last_name => "Patterson" martin = Author.create! :first_name => "George", :last_name => "Martin" tolkien = Author.create! :first_name => "John", :last_name => "Tolkien" ende = Author.create! :first_name => "Michael", :last_name => "Ende" ries = Author.create! :first_name => "Eric", :last_name => "Ries" eyal = Author.create! :first_name => "Nir", :last_name => "Eyal" Book.create! :name => "The Hunger Games", :price => 20.00, :author => collins, :genre => ya Book.create! :name => "Catching Fire", :price => 20.00, :author => collins, :genre => ya Book.create! :name => "Mockingjay", :price => 20.00, :author => collins, :genre => ya Book.create! :name => "Is Everyone Hanging out Without Me?", :price => 20.00, :author => kaling, :genre => humor Book.create! :name => "Are You There, Vodka? It's Me Chelsea", :price => 20.00, :author => handler, :genre => humor Book.create! :name => "Death Note", :price => 20.00, :author => ohba, :genre => gnovel Book.create! :name => "One Piece", :price => 20.00, :author => oda, :genre => gnovel Book.create! :name => "The Pelican Brief", :price => 20.00, :author => grisham, :genre => crime Book.create! :name => "A Time to Kill", :price => 20.00, :author => grisham, :genre => crime Book.create! :name => "Along Came a Spider", :price => 20.00, :author => patterson, :genre => crime Book.create! :name => "A Game of Thrones", :price => 20.00, :author => martin, :genre => fantasy Book.create! :name => "A Clash of Kings", :price => 20.00, :author => martin, :genre => fantasy Book.create! :name => "A Storm of Swords", :price => 20.00, :author => martin, :genre => fantasy Book.create! :name => "A Feast for Crows", :price => 20.00, :author => martin, :genre => fantasy Book.create! :name => "A Dance with Dragons", :price => 20.00, :author => martin, :genre => fantasy Book.create! :name => "The Silmarillion", :price => 20.00, :author => tolkien, :genre => fantasy Book.create! :name => "The NeverEnding Story", :price => 20.00, :author => ende, :genre => fantasy Book.create! :name => "The Lean Startup", :price => 20.00, :author => ries, :genre => business Book.create! :name => "Hooked", :price => 20.00, :author => eyal, :genre => business 

Запустив приложение, вы теперь можете видеть пункты « Authors , « Books и « Genres в меню «Панель инструментов». При нажатии на каждый элемент меню вы увидите список элементов в этой коллекции со ссылками « View , « Edit и « Delete для каждого.

Давайте изменим страницу Books со значения по умолчанию, показанного ниже.

books_default_view

Сначала измените отображаемые столбцы. Active Admin отображает столбцы для всех полей, которые есть у вашего объекта, но в этом случае мы удалим столбцы Created At и Updated At и добавим столбцы с именем автора и именем жанра. Это делается в методе index в app/admin/book.rb , где указаны включенные столбцы.

 index do column :name column :author column :genre column :price end 

Активный администратор обнаружит отношение belongs_to которое Book имеет с Author и Genre , но вы заметите, что для столбца Author имя записи отображается как Author #1 (в зависимости от идентификатора записи). Глядя на раскрывающееся меню «Автор», которое находится на боковой панели «Фильтры» справа, обратите внимание, что имя объекта «Автор» — это то, что отображается, а не то, что легко читается человеком.

Это связано с тем, что Active Admin решает, какое имя использовать в качестве отображаемого имени для объекта.

 # Active Admin makes educated guesses when displaying objects, this is # the list of methods it tries calling in order setting :display_name_methods, [ :display_name, :full_name, :name, :username, :login, :title, :email, :to_s ] 

Чтобы исправить это, определите метод to_s для модели Author в файле app/models/author.rb .

 class Author < ActiveRecord::Base has_many :books def to_s "#{first_name} #{last_name}" end end 

При обновлении страницы в столбце Автор теперь будут отображаться имя и фамилия автора.

Вы также можете сделать некоторые манипуляции с данными до их отображения. Давайте изменим столбец «Цена» для отображения его валюты. Для этого мы будем использовать помощник number_to_currency . Для долларов не нужно передавать опции в метод.

 ActiveAdmin.register Book do index do column :name column :author column :genre column :price do |product| number_to_currency product.price end default_actions end end 

Метод default_actions добавляет ссылки «View», «Edit» и «Destroy».

Вы можете изменить имя столбца, указав новое имя перед именем поля в методе index.

 column 'New Name', :name 

На правой стороне страницы находится фильтр, который полезен при поиске записей. Возможно, вам не потребуются некоторые атрибуты по умолчанию, которые он предлагает. Для опции Book давайте определим атрибуты, которые мы хотим использовать для фильтрации. В app/admin/book.rb добавить

 filter :name filter :author filter :genre filter :price 

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

 filter :author, :as => :check_boxes filter :genre, :as => :check_boxes 

Боковая панель может быть изменена, чтобы показать больше информации. Например, добавьте боковую панель на страницу « Author », где перечислены все книги, которые автор написал в таблице. В файле app/admin/author.rb внесите следующие изменения.

 ActiveAdmin.register Author do sidebar 'Books by this Author', :only => :show do table_for Book.joins(:author).where(:author_id => author.id) do |t| t.column("Title") { |book| book.name } end end end 

Импорт данных

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

Для этого мы будем использовать гем active_admin_importable . В вашем Gemfile добавьте:

 gem 'active_admin_importable' 

А затем выполните bundle install .

Чтобы включить импорт CSV на странице автора, в app/admin/author.rb добавьте следующее.

 active_admin_importable 

Кнопка « Import Authors появится в правом верхнем углу страницы. Нажмите на нее и найдите в локальной файловой системе файл csv, который вы хотите импортировать. Файл должен иметь строку заголовка, соответствующую атрибутам вашей модели. Вам не нужно включать все столбцы, так как значения по умолчанию будут вставлены для столбцов, которые вы пропустите.

Я создал CSV-файл со следующими двумя записями и импортировал его.

 First name,Last name Jane,Doe John,Doe 

Загрузка данных

Active Admin позволяет загружать данные в форматах CSV, XML или JSON.

Когда вы загрузите файл CSV, вы увидите атрибуты модели в качестве заголовков файла. Вы можете указать, что включено в файл CSV. Для модели «Автор» отформатируйте наш CSV-файл, включив в него только имя и фамилию автора.

В app/admin/author.rb следующее.

 csv do column :first_name column :last_name end 

Вы также можете включить экспорт электронных таблиц . Добавьте следующее в Gemfile.

 gem 'activeadmin-axlsx' 

Запустите bundle install . При запуске приложения вы увидите ссылку XLSX, включенную на каждой странице ресурса, в качестве одного из вариантов загрузки данных.

Можно отформатировать данные, экспортированные в электронную таблицу. Ниже указаны имя и фамилия автора, а также изменен цвет заголовка. В app/admin/author.rb доп.

 xlsx(:header_style => {:bg_color => 'C0BFBF', :fg_color => '000000' }) do delete_columns :id, :created_at, :updated_at end 

Если вы не хотите предлагать XML в качестве варианта загрузки, вы можете изменить параметры для конкретной модели, добавив следующее в файл Active Admin модели. Например, в app/admin/author.rb добавьте app/admin/author.rb инструкцию, которая изменит только ссылки на странице автора.

 index download_links: [:csv, :xlsx] 

Чтобы установить параметры для всех ресурсов в вашем пространстве имен, добавьте следующее в файл config/initializers/active_admin.rb .

 ActiveAdmin.setup do |config| config.namespace :admin do |admin| admin.download_links = [:csv, :xlsx] end end 

Вывод

Мы рассмотрели некоторые общие настройки, но у Active Admin есть еще масса функций, которые мы не рассмотрели. Чтобы узнать больше, начните с документации и страницы Github .