はじめに
rails_adminの方ではclone機能をgemで追加して実装出来たのですが……
→ https://qiita.com/MATO/items/116bda1f3629ece0812c
active_adminの方ではgemではなく設定ファイルをいじって実装出来たのでメモです。
かなり汎用性あるコード書けたと思います。
ソースコード
関係ない所もありますが、見返す用に全部載せておきます。
app/admin/items.rb
ActiveAdmin.register Item do
permit_params :kind_id, :name, :memo
# 一覧ページで検索フィルター要らないので消しておく
config.filters = false
# 一覧ページでのデフォルトソート
config.sort_order = 'updated_at_desc'
# 間違って削除しないように処理自体を消しておく
actions :all, :except => [:destroy]
# カスタムアクション、clone
member_action :clone, method: :get do
from_item = Item.find(params[:id])
@item = Item.new
# ここでコピペしておきたいカラムをもう入れてしまう
@item[:kind_id] = from_item.kind_id
@item[:name] = from_item.name
render :new, layout: false
end
# 詳細ページにもCloneボタンを追加
# indexページでエラーが出る、、、のでIF文入れておく
action_item :only => :show do
if params[:id].present?
link_to "Clone Item", clone_admin_item_path(id: params[:id])
end
end
index do
# selectable_column
# id_column
column :kind
column :name
column :memo
actions defaults: false do |item|
item 'View', admin_item_path(item), class: 'view_link member_link'
item 'Edit', edit_admin_item_path(item), class: 'edit_link member_link'
item 'Clone', clone_admin_item_path(id: item.id), class: 'clone_link member_link'
end
end
form do |f|
inputs do
input :name
input :kind, collection: Kind.all.order(:name)
input :memo
end
actions
end
end
これで一覧ページでレコードごとにCloneリンクも追加されて、機能します。
/adminから/manageとかに名前を変更した場合でも、rails routes
で表示されるパスリンク?を使えばいけます。
カスタムアクションとして
今回は「新規作成ページ」というnewと同じ処理する時にちょっとデータを入れただけ、ですね。
ただこれを元にしたら、そのレコードに対しての処理を好き放題にControllerに書くように書けたので、かなり楽しくカスタムできそうです。
参考ページ
GitHubにドンピシャの質問あったのですが、色々と方法ありすぎたり、2013年とちと古かったり、英語だし……でちょっと違いますね。
https://github.com/activeadmin/activeadmin/issues/972
俺のコードの方がキレイ🤤
終わり