mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Clear all current instances before a reload.
If users added an attribute or otherwise changed a CurrentAttributes subclass they'd see exceptions on the next page load. Because `ActiveSupport::CurrentAttributes.current_instances` would keep references to the old instances from the previous request. We can fix this by clearing out the `current_attributes` before we unload constants. Then any change to the model can be autoloaded again since its slot isn't taken by an old instance. We'll still have to call reset before we clear so external collaborators, like Time.zone, won't linger with their current value throughout other code.
This commit is contained in:
parent
96be81303e
commit
85211ea1ef
2 changed files with 8 additions and 2 deletions
|
@ -126,6 +126,11 @@ module ActiveSupport
|
|||
current_instances.each_value(&:reset)
|
||||
end
|
||||
|
||||
def clear_all # :nodoc:
|
||||
reset_all
|
||||
current_instances.clear
|
||||
end
|
||||
|
||||
private
|
||||
def generated_attribute_methods
|
||||
@generated_attribute_methods ||= Module.new.tap { |mod| include mod }
|
||||
|
|
|
@ -8,8 +8,9 @@ module ActiveSupport
|
|||
config.eager_load_namespaces << ActiveSupport
|
||||
|
||||
initializer "active_support.reset_all_current_attributes_instances" do |app|
|
||||
app.executor.to_run { ActiveSupport::CurrentAttributes.reset_all }
|
||||
app.executor.to_complete { ActiveSupport::CurrentAttributes.reset_all }
|
||||
app.reloader.before_class_unload { ActiveSupport::CurrentAttributes.clear_all }
|
||||
app.executor.to_run { ActiveSupport::CurrentAttributes.reset_all }
|
||||
app.executor.to_complete { ActiveSupport::CurrentAttributes.reset_all }
|
||||
end
|
||||
|
||||
initializer "active_support.deprecation_behavior" do |app|
|
||||
|
|
Loading…
Reference in a new issue