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

波打際のブログさん

主に、プログラミング備忘録など。

ActiveAdminノウハウまとめ

はじめに

 私が関わったプロジェクトでActiveAdminを使い倒す機会があったので、ドキュメントに掲載されていないことを中心に トラブル編 と 活用編 の2項目を備忘録程度にまとめてみました。

想定環境

 Rails4 + ActiveAdmin(1.0.0.pre)

トラブル編

Rails4でインストールできない!!

原因

 Rails4に対応していない`meta_search`というgemが含まれていることが原因です。

対処法

 RubyGemsにリリースされているActiveAdminのバージョンが古いため(0.6.3)、次期リリース予定の`1.0.0.pre`をgithubリポジトリから取得するようにします。
(早く正式リリースしてほしいいけど、なんか大変そう→Release of version 1.0.0 · Issue #3213 · activeadmin/active_admin · GitHub)

gem 'activeadmin', github: 'activeadmin/active_admin'



bundle exec rails g active_admin:install がdeviseの所で止まる。

こんな感じ

$ bundle exec rails g active_admin:install
      invoke  devise
To use devise you need to specify it in your Gemfile. If you don't want to
use devise, run the generator with --skip-users.
原因

deviseが入っていないことが原因です。

対処法

Gemfileに`devise`を追加します。管理画面の認証を使わない場合は --skip-users オプションを使用すれば良いのですが、、、さすがにそれは。。。



ActiveAdmin::ResourceCollection::ConfigMismatch

You're trying to register ActiveAdmin::Comment as Comment, but the existing
ActiveAdmin::Resource config was built for Comment!
とか出る場合。

原因

 ActiveAdminの管理者コメント機能と、プロジェクト内のコメントモデル(Comment)が競合してしまっている状態です。

対処法

 ActiveAdminの管理者コメントのページ名を明示的に指定します。(管理者コメントのページ名`Comment`はさすがに競合しやすいし 1.0.0 でデフォルトを`AdminComment`とかにしちゃえばいいのに・・・)

config/initializers/active_admin.rb

config.comments_registration_name = 'AdminComment'



I18n::MissingTranslationData

`translation missing: ja.time.formats.long`
とか出てくる場合。

原因

 ActiveAdminで使用している日時フォーマット用の言語ファイルが存在しないことが原因です。

対処法

 Gemfileに`rails-i18n`を追加します。



フォームがローカライズされない。

原因

 ActiveAdminがフォーム作成に使用している`formtastic`の言語ファイルが存在しないことが原因です。

対処法

 言語ファイルを作ります。(ちなみにformtasticの方針では、言語ファイルの管理はしないみたいなので言語ファイルのプルリクは蹴られていました。)

ja:
  formtastic:
    :yes: 'はい'
    :no: 'いいえ'
    :create: '%{model}を作成'
    :update: '%{model}を更新'
    :submit: '%{model}を投稿'
    :cancel: '%{model}を中止'
    :reset: '%{model}を初期化'
    :required: '必須'

活用編

ActiveAdminのロケールファイル

 ドキュメントのI18nの項目を見ても、`Coming soon…` になっています。基本的にはActiveRecordロケールファイルを見に行くので、batch_actionsとscopesに関して記述します。

ja:
  active_admin:
    batch_actions:
      labels:
        hoge: 'ほげ' # hoge というバッチアクションに使用されるラベル。
    scopes:
      foo: 'ふう・・・' # foo というスコープに使用されるラベル。



特定のアクションの時だけEargerLoadしたい。

 EargerLoadはscoped_collectionを上書きすることで実現できますが、特定のアクションだけEargerLoadしたい場合は次のように実装します。

controller do
  def scoped_collection
    case action_name
      when 'show'
        super.includes(:hoges)
      else
        super
    end
  end
end

ActiveAdminのコントローラはApplicationControllerを継承した、普通のコントローラなのでaction_nameなどのメソッドを使用して挙動を変化させます。



関連付けされたレコードを表示したい。

 belongs_to等で関連付けされたレコードを表示する場合は`attribute_table_for`を使用します。
下記のコードはユーザの名前と年齢を出力する例です。

panel 'タイトル' do
  attributes_table_for user do
    row(:name)
    row(:age)
  end
end



関連付けされた複数のレコードを表示したい。

 has_many等で関連付けされた複数のレコードを表示する場合は`paginated_collection`を使用することで、ページネーションできる表が出力されます。
下記のコードはparentに関連付けされたchildrenを30件ずつ出力する例です。

panel "タイトル" do
  paginated_collection(parent.children.page(params[:children_page]).per(30), param_name: 'children_page') do
    table_for collection do
      column(:id)
      column(:hoge)
      column(:fuga)
    end
  end
end



ActiveAdminのフォームにいろんなやつ(てきとう)を表示したい

 いろんなやつ 表示できます!!!

# 日時選択
f.input :foobar_at, :as => :datetime_picker

# セレクトボックス
f.input :hoges, :as => :select, :collection => [['ラベル1', 1],['ラベル2',2]]

# チェックボックス
f.input :fugas, :as => :check_boxes, :collection => [['ラベル1', 1],['ラベル2', 2]]



ページに簡単なJSを埋め込みたい。

 ちょっとしたJSをそのページだけに埋め込みたい場合はこんな感じで記述します。

script do
raw <<RAW_SCRIPT
  alert('aaaaa');
RAW_SCRIPT
end



管理画面へのリンクを簡単に貼りたい。

 admin_hoge_hoge_path(hoge) みたいに、メソッドを叩いてパスを取得しなくても次の方法で管理画面へのリンクを作れます。

link_to hoge.title, [:admin, hoge]

ポリモーフィックなレコードの管理画面にリンクを貼るのが100倍楽になります。

最後に

 未熟者ゆえ、「ここ間違ってるよー」とか「もっとかっこいい実装あるぜ!!」とかあったらコメント欄からご指摘おねがいします。