Last Updated: 2021-05-16
How does reloading work (e.g. in Rails, pre Zeitwerk):
Before each request (or console command), Rails calls
Object#remove_const for every constant - e.g. for
User, it calls
Object.send :remove_const, "User"
Because of this, any caching/storage of a reloaded constant in a place that isn't reloaded (e.g. as a global variable) will cause bugs:
# config/initializers/configure_payment_gateway.rb # careful: global variable being set $PAYMENT_GATEWAY = Rails.env.production? ? RealGateway : MockedGateway
Now, even when
MockedGateway gets changed,
$PAYMENT_GATEWAY is stuck with
the original version when the initializer ran. I.e reloading does not work.