Supercharge your Rails App with Active Admin
Introduction
Crafting robust and intuitive administrative interfaces can be a time-consuming task. Enter ActiveAdmin, a gem that revolutionizes how developers build robust and customizable admin panels. With its sleek interface and extensive feature set, ActiveAdmin simplifies creating, customizing, and managing administrative dashboards for Ruby on Rails applications. Let's delve deeper into the world of ActiveAdmin and explore its capabilities, benefits, and how to harness its full potential.
What is ActiveAdmin?
ActiveAdmin is an open-source Ruby on Rails framework that provides a simple and effective way to build elegant admin interfaces for web applications. It offers a DSL (Domain Specific Language) for defining resources, allowing developers to quickly generate their models' CRUD (Create, Read, Update, Delete) interfaces. ActiveAdmin is built on popular libraries such as Devise for authentication and CanCanCan for authorization, making it highly customizable and secure.
Getting Started with Active Admin
Installation
Add the ActiveAdmin gem to your Gemfile
and
run bundle install to install the gem.
# Gemfile
gem 'activeadmin'ActiveAdmin integrates well with the below gems.
You can add them to your Gemfile
and
execute bundle install.
# Gemfile
gem 'devise'
gem 'cancancan'
gem 'draper'
gem 'pundit'Generate Admin Interface
Use the rails generate active_admin:install command to generate
the necessary files
and
configuration for ActiveAdmin.
rails generate active_admin:installThe generator will create the following files.
app/admin/dashboard.rb
app/assets/javascripts/active_admin.js
app/assets/stylesheets/active_admin.scss
config/initializers/active_admin.rbTo verify the changes, execute database migration, seed the table and run your server.
rails db:migrate
rails db:seed
rails serverThe seed data creates an admin user with email as [email protected]
and
password as password.
Navigate to localhost:3000
and
log in using these admin credentials.
You will see the new Active Admin dashboard.
You must execute the command below, to register an existing model with Active Admin.
rails generate active_admin:resource MyModelThe command generates a file at app/admin/my_model.rb.
Just refresh your browser to see the model name reflected in the UI.
If you want to use webpacker in your new Rails application,
along with ActiveAdmin,
you must pass the --use_webpacker option to the generator command.
rails g active_admin:install --use_webpackerFor existing applications, you must edit the ActiveAdmin initializer file.
# config/initializers/active_admin.rb
ActiveAdmin.setup do |config|
config.use_webpacker = true
endAfter setting the use_webpacker config,
run the below generator command.
rails g active_admin:webpackerConfiguration
Configuring ActiveAdmin is essential for tailoring the administrative interface to fit the specific needs of your application. The gem offers a wide range of customization options, from basic settings like site title and menu items to advanced features such as customizing filters and adding custom actions. Let's explore the general configuration options in ActiveAdmin.
Authentication
Configure authentication settings to control access to the admin panel. By default, ActiveAdmin uses Devise for authentication.
# config/initializers/active_admin.rb
config.authentication_method = :authenticate_admin_user!
config.current_user_method = :current_admin_userTo turn off authentication via ActiveAdmin, set the above config features to false.
# config/initializers/active_admin.rb
config.authentication_method = false
config.current_user_method = falseAuthorization
Define authorization rules to manage user permissions
and
access levels.
ActiveAdmin integrates with CanCanCan for role-based authorization.
To know more about CanCanCan,
please refer to our
cancancan
blog post.
config.authorization_adapter = ActiveAdmin::CanCanAdapterIf you are using
Pundit,
set the authorization_adapter to Pundit as below.
config.authorization_adapter = ActiveAdmin::PunditAdapterSite Title and Logo
Set the title
and
logo for your ActiveAdmin dashboard using the site_title
and
site_title_image methods in the config/initializers/active_admin.rb file.
config.site_title = "My Admin Dashboard"
config.site_title_image = "/path/to/logo.png"Dashboard Configuration
Customize the dashboard by adding widgets,
panels,
or
custom content.
You can define the dashboard layout in the app/admin/dashboard.rb file.
ActiveAdmin.register_page "Dashboard" do
content title: "Dashboard" do
# Add widgets or custom content here
end
endCustomizing Resource Views
Customize the appearance and behaviour of resource views by defining custom actions, filters, and index displays.
ActiveAdmin.register User do
actions :index, :show, :edit, :update
filter :email
index do
selectable_column
id_column
column :email
actions
end
endMenu Items
Configure the menu items displayed in the sidebar navigation. You can define custom menu items and organize them into categories.
config.namespace :admin do |admin|
admin.build_menu do |menu|
menu.add label: "Dashboard", priority: 1
menu.add label: "Users", priority: 2
# Add more menu items as needed
end
endComments
Active Admin automatically incorporates comments on resources,
which may only sometimes be desired.
To deactivate comments for the resources,
update the comments config to false.
ActiveAdmin.setup do |config|
config.comments = false
end
# For a given resource:
ActiveAdmin.register User do
config.comments = false
endManaging resources
Managing resources is a fundamental aspect of building administrative interfaces with ActiveAdmin. Resources represent models in your Rails application, and ActiveAdmin provides various tools to work with them efficiently. Here's a guide on how to work with resources in ActiveAdmin:
Registering Resources:
To work with a model in ActiveAdmin,
you need to register it.
This is typically done in files within the app/admin directory.
For example:
ActiveAdmin.register User do
# Configuration for the User resource
endThis registers the User model with ActiveAdmin, allowing you to manage it through the admin interface.
Customizing Resource Views
ActiveAdmin provides DSL methods to customize the appearance and behaviour of resource views. For example, you can define index displays, show pages, forms, and custom actions.
ActiveAdmin.register User do
index do
selectable_column
id_column
column :first_name
column :created_at
actions
end
show do
attributes_table do
row :first_name
row :last_name
row :created_at
end
end
form do |f|
f.inputs "User Details" do
f.input :first_name
f.input :last_name
f.input :email
end
f.actions
end
endFilters and Scopes
ActiveAdmin allows you to define filters and scopes to facilitate searching and filtering of resources. Filters are typically added to index pages, while scopes provide predefined filters.
ActiveAdmin.register User do
filter :email
scope :active
scope :deactivated
endActions
ActiveAdmin provides built-in actions such as edit, delete, view, and new. Additionally, you can define custom actions to perform specific tasks on resources.
ActiveAdmin.register User do
actions :index, :show, :new, :edit
member_action :deactivate, method: :put do
# Logic to deactive a user
end
endDisabling Actions
All CRUD actions are enabled by default. You can turn off actions for a given resource.
ActiveAdmin.register User do
actions :all, except: [:update, :destroy]
endCustomizing the Index Page and CSV format
Customizing the index page in ActiveAdmin allows you to tailor the presentation of your resource's data to fit your specific needs and preferences. Users typically view a list of records for a particular model on the index page.
Sorting and Pagination
ActiveAdmin automatically handles pagination for index pages.
You can configure the number of records per page
and
customize the pagination theme in the initializer file
(config/initializers/active_admin.rb).
config.default_per_page = 20
config.pagination_theme = :ajaxAdditionally,
you can enable sorting by columns by specifying the sortable option:
index do
sortable_columns :first_name, :last_name, :created_at
# Other column definitions
endCustomizing Download Links
Customizing download links in ActiveAdmin allows
you to provide users with convenient ways to export data from your application.
ActiveAdmin offers built-in support
for exporting data to various formats such as CSV,
XML,
and
JSON.
# Per resource
ActiveAdmin.register User do
index download_links: false
index download_links: [:pdf]
index download_links: proc { current_user.can_view_download_links? }
end
# For the entire application
ActiveAdmin.setup do |config|
config.download_links = false
config.download_links = [:csv, :xml, :json, :pdf]
config.download_links = proc { current_user.can_view_download_links? }
endPlease be aware that you need to implement PDF rendering for your action; ActiveAdmin doesn't offer this functionality. This configuration enables you to define formats that should be displayed within the index collection.
CSV format
When it comes to customizing the CSV format in ActiveAdmin, you have the flexibility to tailor the exported CSV file according to your specific requirements. Here's a guide on how to customize the CSV format in ActiveAdmin.
Customizing the CSV format is as simple as customizing the index page.
ActiveAdmin.register User do
csv do
column :email
column(:full_name) { |user| user.full_name }
end
endYou can customize he labels of the CSV columns by passing a label parameter to the column method:
ActiveAdmin.register Post do
csv do
column :id, label: "Post ID"
column :title, label: "Post Title"
column :author, label: "Author Name"
column(:created_at, label: "Creation Date") { |post| post.created_at.strftime("%Y-%m-%d") }
end
endYou can also set system-wide custom CSV settings.
# Set the CSV builder separator
config.csv_options = { col_sep: ';' }
# Force the use of quotes
config.csv_options = { force_quotes: true }Custom Authorization Adapter
Creating a custom authorization adapter in ActiveAdmin allows you to implement complex authorization logic tailored to your application's needs.
Start by creating a new class that inherits from ActiveAdmin::AuthorizationAdapter.
This class will contain your custom authorization logic.
# app/admin/custom_authorization_adapter.rb
class CustomAuthorizationAdapter < ActiveAdmin::AuthorizationAdapter
def authorized?(action, subject = nil)
# Your authorization logic goes here
end
endTo use CustomAuthorizationAdapter to Active Admin,
go to your application's config/initializers/active_admin.rb
and
add/modify the line.
config.authorization_adapter = "CustomAuthorizationAdapter"When a controller action is performed,
the CustomAuthorizationAdapter's #authorized? method will be called.
With your custom authorization adapter configured, you can now use it within your resource definitions to enforce authorization rules. For example:
ActiveAdmin.register User do
controller do
def scoped_collection
if authorized?(:read, User)
super
else
# Return a scoped collection based on authorization logic
end
end
end
endActiveAdmin::AuthorizationAdapter also provides a hook method (#scope_collection)
for the adapter to scope the resource;s collection.
For example,
you may want to centralize the scoping:
class CustomAuthorizationAdapter < ActiveAdmin::AuthorizationAdapter
def authorized?(action, subject = nil)
subject.account == user.account
end
def scope_collection(collection, action = Auth::READ)
collection.where(account_id: user.account_id)
end
endCustom Pages
Custom pages in ActiveAdmin allow you to create additional pages within your admin interface to display custom content, perform specific tasks, or integrate external functionality.
Start by creating a new ActiveAdmin page using the register_page method.
You can define the content of the page using the content block.
ActiveAdmin.register_page "Custom Page" do
content title: "Custom Page" do
# Add custom content here
end
endThis will create a new "Custom Page" page with the specified content in the ActiveAdmin sidebar.
You can add any custom HTML, CSS, or JavaScript code within the content block to create the desired functionality or display. You can use the components and helpers Active Admin provides to generate content dynamically.
ActiveAdmin.register_page "Custom Page" do
content title: "Custom Page" do
panel "Custom Panel" do
para "This is a custom panel."
end
# Add more custom content here
end
endIf your custom page requires specific routes or parameters, you can define them using the controller block and specify custom routes within the associated controller.
ActiveAdmin.register_page "Custom Page" do
controller do
def index
# Custom controller logic
end
end
endBy creating custom pages in ActiveAdmin, you can extend the functionality of your admin interface to meet specific requirements, integrate external tools or services, and provide a seamless user experience for administrators.
Decorators
Decorators in ActiveAdmin provide a convenient way to customize the appearance and behaviour of resources without directly modifying the underlying model or ActiveAdmin resource configuration. Decorators act as a separate layer between the model and the view, allowing you to encapsulate presentation logic and keep your codebase clean and organized.
# app/models/user.rb
class User < ActiveRecord::Base
end
# app/decorators/user_decorator.rb
class UserDecorator < Draper::Decorator
delegate_all
def profile_image
h.image_tag model.image_url
end
end
# app/admin/user.rb
ActiveAdmin.register User do
decorate_with UserDecorator
index do
column :full_name
column :profile_image
actions
end
endOnce you've defined the decorator, you can use it within your ActiveAdmin resource configuration to customize the appearance of resources. You can decorate individual resource instances or entire collections.
ActiveAdmin.register User do
decorate_with UserDecorator
index do
column :id
column "full_name", :full_name
actions
end
endUsing decorators in ActiveAdmin, you can separate presentation logic from your models and ActiveAdmin resource configurations, leading to a cleaner and more maintainable codebase.
Key Features of Active Admin
-
Rapid Prototyping: Quickly set up basic CRUD (Create, Read, Update, Delete) operations for your models.
-
Intuitive DSL: Leverage a clean and concise syntax to define resources, actions, and views.
-
Flexible Customization: Customize nearly every aspect of the admin interface, from layouts to individual fields.
-
Pre-built Components: Benefit from built-in components like filters, sorting, and pagination for a polished user experience.
-
Themable Interface: Tailor the look and feel of the admin panel to match your application's style.
Benefits of Using Active Admin
-
Increased Development Speed Focus on core application logic instead of spending time on repetitive admin panel development.
-
Improved Maintainability Consistent code structure and clear separation of concerns make the admin interface easier to maintain.
-
Enhanced User Experience Provide a user-friendly interface for managing data within your application.
-
Reduced Code Duplication Active Admin's abstractions minimize redundant code, keeping your codebase clean.
Conclusion
Active Admin is a powerful tool for Ruby on Rails developers who want to create efficient, user-friendly administrative interfaces. Its ease of use, flexibility, and extensive features make it a valuable addition to your Rails development toolkit. If you're looking to streamline your admin panel development process, Active Admin is worth exploring.