setoya-blog

システム開発技術、データ分析関連でお勉強したことや、山奥生活を綴る、テンション低めなブログです。

ActiveAdminにカスタムアクションを追加する

通常、ActiveAdminで
/admin/model/:idのようなモデルの内容を表示するURLには、以下のような標準のアクションアイテムがついている。(画像はCountryというモデルの場合)

f:id:sessan:20120821171939p:plain

これ以外にもアクションアイテムを追加したいことは、実際の運用時はよくあるが、以下の様な手順で追加を行う。

カスタムアクションについての、公式資料は以下(※ただし、そのままやっても動かないところとかがあった。)

Active Admin | The administration framework for Ruby on Rails

作業流れ

  1. member_actionの追加
  2. member_actionを実行するaction_itemの追加

1. member_actionの追加

カスタムアクションを追加したいモデルのActiveAdmin用のファイルに以下のようなmember_actionの定義を行う

/admin/countries.rb

# coding : utf-8
ActiveAdmin.register Country do

  member_action :hoge_logic, :method => :post do
    country = Country.find_by_id(params[:id])
    redirect_to url_for({:action => :show}), :notice => 'ロジックを実行しました'
  end


end

これで自動的に以下の様なroutingも定義される

POST /admin/countries/:id/hoge_logic

httpメソッドは、member_actionの定義時に指定している:methodと一致している。


カスタムアクションを実行するインスタンスを指定するためのidはparams[:id]で渡ってくるのでそれを使う。

2. member_actionを実行するaction_itemの追加

ここまでの作業でmember_actionを呼び出す準備はできたが、画面に呼び出すためのボタンがまだない。このボタンを追加するためには、action_itemを追加する必要がある。

action_itemを追加した最終的な/admin/coutries.rb

# coding : utf-8
ActiveAdmin.register Country do

  member_action :hoge_logic, :method => :post do
    country = Country.find_by_id(params[:id])
    redirect_to url_for({:action => :show}), :notice => 'ロジックを実行しました'
  end


  action_item :only => :show do
    link_to('カスタマイズロジックの実行', {:controller => 'admin/countries', :action => :hoge_logic, :id => params[:id]}, :method => :post, :confirm => '本当にロジックを実行しますか?')
  end

end

アクションアイテムを表示するのは、編集画面ではなく/admin/model/:idのようなモデルの内容を表示するURLにしたい時は、:only => :showを指定する。

ここでは、POSTなので、:confirmをつけているがこれは必要に応じて変更する。
ちなみに、link_to以外のbutton_toヘルパーとかも普通に使えます。

これで、以下の様なカスタムアクションを呼び出すボタンが付きます。
f:id:sessan:20120821173438p:plain