Decorators

Active Admin allows you to use the decorator pattern to provide view-specific versions of a resource. Draper is recommended but not required.

Example usage

# app/models/post.rb
class Post < ActiveRecord::Base
  # has title, content, and image_url
end

# app/decorators/post_decorator.rb
class PostDecorator < Draper::Decorator
  delegate_all

  def image
    h.image_tag model.image_url
  end
end

# app/admin/post.rb
ActiveAdmin.register Post do
  decorate_with PostDecorator

  index do
    column :title
    column :image
    actions
  end
end

You can pass any decorator class as an argument to decorate_with as long as it accepts the record to be decorated as a parameter in the initializer, and responds to all the necessary methods.

# app/decorators/post_decorator.rb
class PostDecorator
  attr_reader :post
  delegate_missing_to :post

  def initialize(post)
    @post = post
  end
end

If a given resource uses ActiveAdmin’s Comments feature, then that resource’s decorator class must respond to model where it returns the model instance and decorated? returns true.

# app/decorators/post_decorator.rb
class PostDecorator
  attr_reader :post
  delegate_missing_to :post

  def initialize(post)
    @post = post
  end

  def decorated?
    true
  end

  def model
    post
  end
end

If you use any actions with param(e.g. show, edit, destroy), your decorator class must explicitly delegate to_param to the decorated model.

# app/decorators/post_decorator.rb
class PostDecorator
  attr_reader :post
  delegate_missing_to :post
  delegate :to_param, to: :post

  def initialize(post)
    @post = post
  end
end

Forms

By default, ActiveAdmin does not decorate the resource used to render forms. If you need ActiveAdmin to decorate the forms, you can pass decorate: true to the form block.

ActiveAdmin.register Post do
  decorate_with PostDecorator

  form decorate: true do |f|
    # ...
  end
end
Copyright 2011 Greg Bell and VersaPay