読者です 読者をやめる 読者になる 読者になる

49hack

見習いエンジニアが魔法使いになるまで

【随時更新】ActiveAdminのカスタマイズあれこれ

ActiveAdminをいろいろカスタマイズしてるのでそのメモです。随時更新しています〜。

セルに表示するコンテンツを増やす

セルにはもともとデータが1つしか表示されませんが、+で増やすことができます。

ActiveAdmin.register Post do
...
  index do
    column :id
    column :content
    column :lots_of do |c|
      span('hoge') + span('fuga')
    end
  end
...

改行も入れて見やすくしてやるとなお良し。

ActiveAdmin.register Post do
...
  index do
    column :id
    column :content
    column :lots_of do |c|
      content = Array.new
      content.push("hoge")
      content.push("fuga")
      raw(content.join('<br>'))
    end
  end
...

actionsで表示するアクションを追加する

actionsの場所にカスタムアクションを追加できます。

ActiveAdmin.register Post do
...
  index do
    column :id
    column :content
    actions defaults: true do |c|¬
      link_to('custom link', '/custom')
    end
  end
...

複数追加できます。

ActiveAdmin.register Post do
...
  index do
    column :id
    column :content
    actions defaults: true do |c|¬
      link_to('custom link1', '/custom1') + link_to('custom link2', '/custom2')
    end
  end
...

参考

カラムの幅を指定する

公式ドキュメントに書かれているmax_widthmin_widthが効かないので、クラス指定してスタイルシートで指定してやるしかないぽい。クラス指定の方法は以下のとおり。

ActiveAdmin.register Post do
...
  index do
    column :id
    column :content, class: :my_class
    actions
  end
...

参考

viewを別ファイルから読み込む

例えば、formのときはerbやslimで書いたviewを読み込みたい場合は以下のようにします。

ActiveAdmin.register Post do
...
  form partial: 'form'
...

app/view/active_admin/post/_form.html.erbに以下のように書いていけばOKです。

<%= form_for @post do |f| %>
...

モデルに紐付かないページをつくる

register_pageを使うとモデルに紐付かない自由度の高いページをつくれます。 page_actionでアクションを追加します。

ActiveAdmin.register_page "my_page" do
  page_action :hoge, method: :get
  page_action :fuga, method: :post

  controller do
    def index
    end
    
    def hoge
      # ...
    end

    def fuga
      # ...
    end
...

ログインユーザの表示名を変更する

デフォルトではemailが表示されたりしているので独自のプロパティに変更しましょう。

# config/initializers/active_admin.rb
ActiveAdmin.setup do |config|
    config.display_name_methods = [:original_method, :email, :hogehoge]
end

他にも設定できる項目いろいろあるのでlib/active_admin/application.rbを見ると良いです。

参考

既存のフィルター(before_filterとか)をスキップする

たとえば、application_controllerに書いている共通のbefore_filterは管理画面では不要なことがあります。スキップしましょう。

Stack Overflowの方法(config.skip_before_filter)がなぜか効きませんでした。以下で対応できます。

# config/initializers/active_admin.rb
ActiveAdmin::BaseController.class_eval do
  skip_before_filter :filter_name, :you, :want_to, :skip
end

参考

before_filterでインスタンス変数を定義する

例えばindexで共通のインスタンス変数を利用したい場合は以下のようにします。

このときindexブロックでインスタンス変数にアクセスする場合は@は不要です。

# app/admin/hoge.rb
ActiveAdmin.register Hoge do
    ...
    controller do
        before_filter :set_name, only: :index

        def set_name
            @name = "abc"
        end
    end

    index do
        column :id
        column :fuga do |h|
            name # ここでは@は不要
        end
        actions
    end
    ...
end

参考

その他参考