Можно ли использовать ActiveAdmin для не-ActiveRecord (например, activeModel или Mongoid и т.д.)?

Вопрос в значительной степени говорит обо всем.

У меня есть существующий сайт, который поддерживает хорошо определенный API.

Мне нужно создать для него приятный интерфейс управления, и поскольку я использовал ActiveAdmin для создания эффекта раньше, я бы хотел использовать его здесь.

Однако я не могу найти никаких подробностей о том, возможно ли сделать это.

Я читал комментарии, говорящие, что AA поддерживает объекты типа ActiveModel, которые не должны быть основаны на ActiveRecord, но я уже давно не пытался это сделать или нашел какие-либо примеры.

Кто-нибудь знает, возможно ли это?

Ответ 1

Я смог достичь этого, используя пользовательскую страницу ActiveAdmin.

В нашем примере мы имеем модель под названием MailingList. Это класс Ruby, который включает в себя некоторые возможности ActiveModel.

# 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

Чтобы использовать эту управляемую API-модель в ActiveAdmin, мы создаем такую ​​страницу.

# 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

Методы page_action действуют как действия контроллера.

Чтобы это работало, как ожидалось, мне пришлось добавить следующие маршруты

# 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

Вам также понадобятся некоторые виды в

app/views/admin/mailing_lists/index.html.erb app/views/admin/mailing_lists/show.html.erb app/views/admin/mailing_lists/new.html.erb

Ответ 2

ActiveAdmin написан для работы с ActiveRecord, и по умолчанию у него нет поддержки для других ORM. Тем не менее, есть некоторые плагины для добавления поддержки для некоторых. Вот два, которые я нашел:

Ответ 3

Здесь полезный ответ на этот вопрос здесь. Вкратце скажем, что нужно видеть источники источников рельсов db-адаптеров (в настоящее время на пути rails/activerecord/lib/active_record/connection_adapters/) возможно на эта ссылка где адаптеры ActiveRecord. И особенно, чтобы увидеть и взять abstract_adapter.rb для реализации.

Ответ 5

Когда мы говорим, используя любой драгоценный камень над перекрестными ORM, самая важная часть заключается в том, поддерживает ли этот конкретный камень другие ORM или нет.

В случае Active Admin, я могу догадаться, они планировали поддерживать ActiveRecord и Mongoid по дизайну. Из самой базы кода вы можете увидеть ее https://github.com/gregbell/active_admin/tree/master/lib/active_admin/orm. Но почему-то они не смогли его завершить.

Кроме того, если вы планируете использовать, Mongoid в качестве основного ORM (с mongoDB), есть и другие варианты для фреймворков администратора.

Но для ответа на ваш вопрос НЕТ, вы не можете использовать ActiveAdmin с Mongoid. Вместо этого вы можете посмотреть https://github.com/elia/activeadmin-mongoid (как упоминалось выше в комментарии)