通常、ActiveAdminで
/admin/model/:idのようなモデルの内容を表示するURLには、以下のような標準のアクションアイテムがついている。(画像はCountryというモデルの場合)
これ以外にもアクションアイテムを追加したいことは、実際の運用時はよくあるが、以下の様な手順で追加を行う。
カスタムアクションについての、公式資料は以下(※ただし、そのままやっても動かないところとかがあった。)
Active Admin | The administration framework for Ruby on Rails
作業流れ
- member_actionの追加
- 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ヘルパーとかも普通に使えます。
これで、以下の様なカスタムアクションを呼び出すボタンが付きます。