rails-antipattern-callback-hell

Installation
SKILL.md

Antipattern: Callback Hell

The smell

  • Multiple after_create / after_save / after_commit callbacks doing side effects (charges, emails, jobs, external APIs)
  • update_columns used as a workaround to skip them
  • Tests must stub or skip callbacks to keep the suite fast
  • "Save without notifying" requires hacks

Why it hurts

  • Implicit side effects — call sites can't see what happens
  • Callback ordering bugs are silent and rare-to-reproduce
  • Re-saving for unrelated reasons re-fires effects
  • Hard to compose alternative flows (admin imports, backfills)

The fix

  • Make side effects explicit at the call site. Replace lifecycle callbacks with named methods controllers/jobs invoke
  • Push async work to jobs triggered explicitly, not from after_commit
  • Reserve callbacks for invariants tightly coupled to persistence: before_validation normalization, derived columns, dependent: :destroy — things that don't reach outside the row
Installs
2
First Seen
May 8, 2026
rails-antipattern-callback-hell — gierd-inc/dev-skills