Вступ:
Active Admin — це потужна адміністративна платформа для застосунків Ruby on Rails, яка спрощує процес створення надійних та налаштовуваних адміністративних інтерфейсів. Одна з його ключових можливостей — це здатність легко створювати та застосовувати власні фільтри, що дозволяє адміністраторам ефективно керувати та аналізувати дані. У цьому блозі ми дослідимо можливості власних фільтрів в Active Admin, розглянемо їх потенціал та продемонструємо, як використовувати їх для покращення адміністративних можливостей вашого застосунку Rails.
Розуміння фільтрів Active Admin:
Active Admin поставляється з вбудованими фільтрами, які допомагають користувачам швидко шукати та фільтрувати записи за конкретними критеріями. Однак є ситуації, коли стандартних фільтрів недостатньо. Тут на допомогу приходять власні фільтри. Власні фільтри дозволяють створювати індивідуальні параметри пошуку та фільтрації, що відповідають унікальним вимогам вашого застосунку.
Створення простого власного фільтра:
Почнемо з того, як створити простий власний фільтр для уявної моделі "Product". Припустимо, ми хочемо фільтрувати продукти за їх статусом доступності, з опціями "В наявності" та "Немає в наявності".
# app/admin/product.rb
ActiveAdmin.register Product do
filter :name
filter :price
filter :availability, as: :select, collection: ["В наявності", "Немає в наявності"]
# Інші налаштування та дії...
end
У цьому прикладі ми додали власний фільтр для атрибута "availability", що дозволяє адміністраторам фільтрувати продукти залежно від того, чи є вони в наявності.
Використання Ransack для розширених фільтрів:
Active Admin використовує бібліотеку Ransack для обробки пошуку та фільтрації. Ransack надає потужний інтерфейс запитів для ActiveRecord, що дозволяє виконувати складні пошуки з легкістю. Розглянемо, як використовувати Ransack для створення більш складних власних фільтрів.
# app/admin/product.rb
ActiveAdmin.register Product do
filter :name
filter :price
filter :availability, as: :select, collection: ["В наявності", "Немає в наявності"]
# Власний фільтр за допомогою Ransack
filter :created_at_gteq, label: 'Створено після', as: :date_range
filter :category_id_in, label: 'Категорії', as: :select, collection: Category.all.map { |c| [c.name, c.id] }
# Інші налаштування та дії...
end
У цьому прикладі ми додали фільтр діапазону дат для продуктів, створених після певної дати, а також фільтр для продуктів, що належать до вибраних категорій. Можливості запитів Ransack надають гнучке та розширюване рішення для обробки різних вимог до фільтрації.
Інтеграція сторонніх бібліотек:
Active Admin підтримує інтеграцію зі сторонніми JavaScript бібліотеками для покращення досвіду фільтрації. Розглянемо інтеграцію бібліотеки Select2 для більш зручного багатофункціонального фільтра.
# app/admin/product.rb
ActiveAdmin.register Product do
filter :name
filter :price
filter :availability, as: :select, collection: ["В наявності", "Немає в наявності"]
# Власний фільтр за допомогою Ransack та Select2
filter :category_id_in,
label: 'Категорії',
as: :select,
collection: Category.all.map { |c| [c.name, c.id] },
input_html: { class: 'select2', multiple: true }
# Інші налаштування та дії...
end
У цьому прикладі опція input_html
використовується для вказівки додаткових HTML атрибутів для елемента вводу фільтру. Це включає клас select2
, що активує бібліотеку Select2 для більш інтерактивного та зручного багатофункціонального фільтра.
Два рівні вкладеності:
Якщо ваш застосунок Rails містить складні асоціації з двома рівнями вкладеності, Active Admin надає потужне рішення для створення власних фільтрів, що відповідають вашим вимогам.
Приклад на практиці:
Давайте розглянемо практичний приклад з використанням моделі ProductItem, яка має два рівні вкладеності, а саме продукт і користувач.
Припустимо, у вас є наступна структура моделей:
class ProductItem < ApplicationRecord
belongs_to :product
end
class Product < ApplicationRecord
belongs_to :user
has_many :product_items, dependent: :destroy
end
class User < ApplicationRecord
has_many :products, dependent: :destroy
end
Тепер налаштуємо власні фільтри в Active Admin для цього випадку:
# app/admin/product_item.rb
ActiveAdmin.register ProductItem do
filter :product_invoice_number_cont, as: :string, label: 'Номер рахунку продукту'
filter :product_user_name_cont, as: :string, label: 'Ім’я клієнта'
index do
# Ваш код для відображення списку тут
end
end
У цьому прикладі:
product_invoice_number_cont
припускає, щоproduct
— це перша асоціація.product_user_name_cont
припускає, щоuser
вкладений уproduct
, аname
— це атрибут у вкладеній асоціаціїuser
.
Налаштуйте імена фільтрів, виходячи з фактичних імен асоціацій та атрибутів. Згідно з конвенцією, імена асоціацій з’єднуються через підкреслення (_
), а потім додається ім’я атрибута з суфіксом _cont
.
Висновок:
Власні фільтри в Active Admin надають потужний механізм для налаштування адміністративного інтерфейсу відповідно до специфічних потреб вашого застосунку Rails. Незалежно від того, чи потрібні вам прості фільтри у вигляді випадаючих списків, чи складні можливості пошуку, Active Admin у поєднанні з Ransack та іншими сторонніми бібліотеками пропонує гнучке та розширюване рішення. Оволодівши власними фільтрами, ви надаєте адміністраторам ефективні інструменти для управління та аналізу даних, що в результаті покращує загальну зручність і ефективність адміністративного інтерфейсу.
Перекладено з: Mastering Custom Filters in Active Admin for Rails Applications