使用RailsAdmin或ActiveAdmin的ActiveResource

时间:2015-04-03 22:10:37

标签: ruby-on-rails activerecord activeadmin rails-admin activeresource

是否有人想出如何使用RailsAdmin或ActiveAdmin或其他类似引擎使用ActiveResource。

看起来两个项目还没有此功能(https://github.com/activeadmin/activeadmin/issues/26https://github.com/sferik/rails_admin/issues/1355)。另一方面,这是一个相当普遍的情况,当你有数据驻留在其他服务/应用程序(在数据库中)时,我想知道是否有人一起攻击它。

我尝试在ActiveResource资源周围创建ActiveRecord包装器。但是,它超出了我对ActiveRecord(可能是Ruby)的了解。

1 个答案:

答案 0 :(得分:3)

AA示例(使用提交802dc451f3b3bd84e736b512d554867c0f2ae011进行测试)

ActiveAdmin.register Payment do

  actions :index
  config.batch_actions = false
  filter :created_at_gteq, as: :date_time_picker

  controller do  

    def find_collection
      @search = OpenStruct.new(params[:q] || {})
      result = Payment.find(:all, params: {
                order: params.fetch(:order, 'created_at_desc'),
                page: params.fetch(:page, 1),
                per_page: params.fetch(:per_page, 50),
                q: params[:q] || {}
              })
      #this uses https://github.com/Fivell/activeresource-response,
      # but can be replaced with other  ActiveResource pagination implementation
      limit = result.http_response['X-Limit-Value'].to_i
      offset = result.http_response['X-Offset-Value'].to_i
      total = result.http_response['X-Total-Count'].to_i
      Kaminari.paginate_array(result, limit: limit, offset: offset, total_count: total)
    end
  end    
end

模型

class Payment <  MyActiveResource

  schema do
    attribute 'customer_id', :integer
    attribute 'amount', :integer
    attribute 'created_at', :string
    attribute 'success', :boolean
  end

  def self.column_names
    content_columns
  end

  def self.content_columns
    if @content_columns.nil?
      @content_columns = Array.new
      known_attributes.each do |name|
        @content_columns << ResourceColumn.new(name)
      end
    end
    @content_columns
  end

  def self.columns
    content_columns
  end

  class ResourceColumn
    attr_reader :name

    def initialize(name)
      @name = name
    end

    def type
      :string
    end
  end

end

补丁

module ActiveAdmin
  module Filters
    module FormtasticAddons
      alias :old_seems_searchable? :seems_searchable?
      def seems_searchable?
        return false if ransacker?
        old_seems_searchable?
      end

      def klass
        @object.try(:object).try(:klass)
      end

      def ransacker?
        klass.try(:_ransackers).try(:key?, method.to_s)
      end

      def scope?
        context = Ransack::Context.for klass rescue nil
        context.respond_to?(:ransackable_scope?) && context.ransackable_scope?(method.to_s, klass)
      end
    end
  end
end

module ActiveAdmin
  module Helpers
    module Collection

      def collection_size(c = collection)
        if c.is_a? ActiveRecord::Relation
          c = c.except :select, :order
          c.group_values.present? ? c.count.count : c.count
        else
          c.respond_to?(:count) ? c.count : 0
        end
      end

    end
  end
end