Hi all! Recently I've noticed an issues with autoloading of a specific classes in my app. I've created a small project which reproduces the issue: https://github.com/knovoselic/autoload_repro/--
All changes required for this repro are part of this commit: https://github.com/knovoselic/autoload_repro/commit/a8cecda742d6d41876abd94f6e0aef4c9758c588
You can just pull the code and run it. The following URL: http://localhost:3000/api/graph/results/crash should crash with uninitialized constant Api::Graph::ResultsController::Graph error.
Calling http://localhost:3000/api/graph/results/success will work fine, and any calls to crash URL after calling success will work fine, until results_controller.rb is modified. Then again crash URL fails.
I've been looking into this and I understand that Rails doesn't know nesting at the point where unknown constant is referenced. This is because Ruby doesn't provide that info in const_missing method. I've been looking at Rails code (specifically lib/active_support/dependencies.rb#load_missing_constant):
I'd like to understand more about the bolded part of the code:
What's the purpose of this check? Why do we stop looking for the constant upwards if it exists in one of these places? If we have the following code:
and we're trying to load Graph, the code will never try to load ::Graph as it will see that Api namespace has Graph defined. But in this example it's pretty clear that Graph doesn't reference Api::Graph.
Why don't we just try to load ::Graph and see if it's there? Can you show me some examples where this would be unwanted behavior?
Just for testing I've modified lib/active_support/dependencies.rb#load_missing_constant like so:
This works fine with the repro project (it doesn't crash anymore) and also passes full rails spec suite (tested on v5.1.6). Any reasons not to do it (or something similar)?
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/2527e1ab-e6ec-4464-8b08-4c48431fd293%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
|Free forum by Nabble||Edit this page|