I was able to achieve this by using an ActiveAdmin custom page.
For our example we have a model called MailingList
. This is a Ruby class that includes some ActiveModel
abilities.
# app/models/mailing_list.rb
class MailingList
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
attr_accessor :name
validates_presence_of :name
def initialize(args)
# Set up instance variables
end
def self.all
# Use API to retrieve list of records
end
def save(args)
# Use API to save record
end
def id
# Unique identifier from API
end
def persisted?
false
end
end
To use this API driven model in ActiveAdmin we create a page like so.
# app/admin/mailing_list.rb
ActiveAdmin.register_page 'Mailing Lists' do
action_item do
link_to 'New Mailing List', admin_mailing_lists_new_path
end
content do
redirect_to :index
end
page_action :index do
@mailing_lists = MailingList.all
render :index, :layout => 'active_admin'
end
page_action :show do
render :show, :layout => 'active_admin'
end
page_action :new do
@mailing_list = MailingList.new
render :new, :layout => 'active_admin'
end
page_action :create, :method => :post do
@mailing_list = MailingList.new(params[:mailing_list])
if @mailing_list.save
redirect_to admin_mailing_list_path(@mailing_list.id)
else
render :new, :layout => 'active_admin'
end
end
end
The page_action
methods act as controller actions.
To get this to work as expected I had to add the following routes
# config/routes.rb
post '/admin/mailing_lists' => 'admin/mailing_lists#create'
get '/admin/mailing_lists/new' => 'admin/mailing_lists#new', :as => :admin_new_mailing_list
get '/admin/mailing_lists/:id' => 'admin/mailing_lists#show', :as => :admin_mailing_list
You will also need some views in
app/views/admin/mailing_lists/index.html.erb
app/views/admin/mailing_lists/show.html.erb
app/views/admin/mailing_lists/new.html.erb