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?

More than 3 years have passed since last update.

ActiveAdmin の定義済みコールバックを使う際の注意点 ~ 保存に失敗しても after_save は実行される ~

Posted at

前置き

ActiveAdminの定義済みコールバックに関しては以下の記事がわかりやすいです。
(参考にさせていただきました、ありがとうございます :bow:

何が起きたか

状況

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
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?