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で使用している日時フォーマット用の言語ファイルが存在しないことが原因です。
フォームがローカライズされない。
原因
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
最後に
未熟者ゆえ、「ここ間違ってるよー」とか「もっとかっこいい実装あるぜ!!」とかあったらコメント欄からご指摘おねがいします。