前置き
ActiveAdminの定義済みコールバックに関しては以下の記事がわかりやすいです。
(参考にさせていただきました、ありがとうございます )
何が起きたか
状況
ActiveAdminにてデータを保存したあとに特定の処理を実行したかった。
ActiveAdmin.register User do
after_save do |user|
# 保存後に実行したい処理
end
end
これで良さそう...?
問題
after_save
内の処理が、バリデーションに引っかかり実際には保存されなかった場合にも実行される。
after_create
など他のコールバックも同様です。
なぜなのか
ActiveSupport::Callback の after_save
の場合、バリデーションに引っかかり保存できなかった場合には実行されません。
そのため、上記の仕様が不自然に(勝手に)感じました。
しかし、上記の参考記事やActiveAdminソース内にも記述がありますが、ActiveSupport のコールバックを使用している訳ではありません。
つまり、本件は完全に ActiveAdmin 独自の仕様のようです。
詳しくは ActiveAdmin のソースを見てみましょう。
解決策
いろいろ方法はあると思いますが、私は以下のようにしました。
ActiveAdmin.register User do
after_save do |user|
if user.persisted?
# 保存後に実行したい処理
end
end
end