是否可以在非基于ActiveRecord的模型上使用ActiveAdmin(比如activeModel或Mongoid等)?

时间:2013-11-04 16:19:43

标签: ruby activerecord activeadmin rails-activerecord

问题几乎说明了一切。

我有一个支持定义良好的API的现有网站。

我需要为它建立一个很好的管理界面,而且,由于我之前使用过ActiveAdmin创建效果,我很乐意在这里使用它。

但是,我找不到有关是否可以这样做的任何细节。

我读过评论说AA支持ActiveModel类型的对象,它们不一定要基于ActiveRecord,但是我已经不用自己尝试了,或者找到了这样的例子。

任何人都知道这是否可能?

5 个答案:

答案 0 :(得分:13)

我可以使用ActiveAdmin custom page来实现这一目标。

对于我们的示例,我们有一个名为MailingList的模型。这是一个包含一些ActiveModel能力的Ruby类。

# 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

要在ActiveAdmin中使用此API驱动模型,我们创建一个类似的页面。

# 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

答案 1 :(得分:1)

编写ActiveAdmin以使用ActiveRecord,默认情况下它不支持其他ORM。但是,有一些插件可用于添加对某些插件的支持。以下是我发现的两个:

答案 2 :(得分:1)

这个问题的有用答案here。简而言之,需要在ActiveRecord适配器所在的this link处查看rails db adapter(当前位于path rails / activerecord / lib / active_record / connection_adapters /)的源代码。特别是要查看并使用abstract_adapter.rb来实现。

答案 3 :(得分:0)

我还没有用过,但它可能是一个起点:https://github.com/elia/activeadmin-mongoid

答案 4 :(得分:0)

当我们说使用任何宝石而非跨越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(如上面评论中所述)