1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ActiveAdmin】コピペ新規作成するcloneアクションを追加する

Last updated at Posted at 2020-09-28

はじめに

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

  # カスタムアクションを他にも追加する時は、同じようにまた違うものを書く!
  # 上のlink_toの下に並べて書いたら上書きされて1つしかボタン増えなかった
  action_item :only => :show do
    if params[:id].present?
      link_to "Exchange color", color_exchange_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

俺のコードの方がキレイ🤤

終わり

追記:2025-08-07

カスタムボタン2つ目を追加したつもりが1つしか反映されない問題、解決したので追記しておきました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?