aboutsummaryrefslogtreecommitdiffstats
path: root/guides
diff options
context:
space:
mode:
authorYves Senn <yves.senn@gmail.com>2014-12-15 10:41:34 +0100
committerYves Senn <yves.senn@gmail.com>2014-12-15 10:43:47 +0100
commitdb1e3f6de27453eff8b58ac222fe465e72db32d3 (patch)
tree2e8af23aaea97f362b9bc366658dd7e67e42eb86 /guides
parent4ffa699799758b49ba4c541494dd5fc84a9766d2 (diff)
downloadrails-db1e3f6de27453eff8b58ac222fe465e72db32d3.tar.gz
rails-db1e3f6de27453eff8b58ac222fe465e72db32d3.tar.bz2
rails-db1e3f6de27453eff8b58ac222fe465e72db32d3.zip
autoloading guide: minor edits.
/cc @fxn
Diffstat (limited to 'guides')
-rw-r--r--guides/source/constant_autoloading_and_reloading.md39
1 files changed, 19 insertions, 20 deletions
diff --git a/guides/source/constant_autoloading_and_reloading.md b/guides/source/constant_autoloading_and_reloading.md
index 1a1df59095..1a33a5b55f 100644
--- a/guides/source/constant_autoloading_and_reloading.md
+++ b/guides/source/constant_autoloading_and_reloading.md
@@ -94,8 +94,8 @@ module called also "A"!
the module object itself could still be alive somewhere and its name would
still be "A::B".
-The idea of a parent namespace it's at the core of the autoloading algorithms
-and helps explain and understand intuitively their motivation, but as you see
+The idea of a parent namespace is at the core of the autoloading algorithms
+and helps explain and understand their motivation intuitively, but as you see
that metaphor leaks easily. Given an edge case to reason about, take always into
account the by "parent namespace" the guide means exactly that specific string
derivation.
@@ -130,8 +130,7 @@ autoloads.
By default, Rails eager loads the application files when it boots in production
mode, so most of the autoloading going on in development does not happen. But
-autoloading may still be triggered because at top-level constants not yet loaded
-may be referenced.
+autoloading may still be triggered during eager loading.
For example, given
@@ -324,7 +323,7 @@ Autoloading Algorithms
### Relative References
-A relative constant may appear in several places, for example, in
+A relative constant reference may appear in several places, for example, in
```ruby
class PostsController < ApplicationController
@@ -334,7 +333,7 @@ class PostsController < ApplicationController
end
```
-all three constants are relative.
+all three constant references are relative.
#### Constants after the `class` and `module` Keywords
@@ -351,8 +350,8 @@ define the controller.
#### Top-Level Constants
-On the contrary, if `ApplicationController` is unknown, an autoload is going to
-be attempted by Rails.
+On the contrary, if `ApplicationController` is unknown, the constant is
+considered missing and an autoload is going to be attempted by Rails.
In order to load `ApplicationController`, Rails iterates over `autoload_paths`.
First checks if `app/assets/application_controller.rb` exists. If it does not,
@@ -380,7 +379,7 @@ for namespaces comes into play.
The basic idea is that given
-```
+```ruby
module Admin
class BaseController < ApplicationController
@@all_roles = Role.all
@@ -427,7 +426,7 @@ test/mailers/previews/posts_controller/post.rb
```
Since the lookup is exhausted without success, a similar search for a directory
-is performed, we are going to see why in the next section:
+is performed, we are going to see why in the [next section](#automatic-modules):
```
app/assets/posts_controller/post
@@ -462,14 +461,14 @@ For example, consider
```ruby
module Admin
- User
+ User # relative reference
end
```
and
```ruby
-Admin::User
+Admin::User # qualified reference
```
If `User` is missing, in either case all Rails knows is that a constant called
@@ -526,7 +525,7 @@ Suppose an application has a backoffice whose controllers are stored in
If `autoload_paths` has a file called `admin.rb` Rails is going to load that
one, but if there's no such file and a directory called `admin` is found, Rails
-creates an empty module and assigns it to the constant `Admin` on the fly.
+creates an empty module and assigns it to the `Admin` constant on the fly.
### Generic Procedure
@@ -709,7 +708,7 @@ If Ruby resolves `User` in the former case it checks whether there's a `User`
constant in the `Admin` module. It does not in the latter case, because `Admin`
does not belong to the nesting.
-Unfortunately autoloading does not know the nesting in the spot where the
+Unfortunately Rails autoloading does not know the nesting in the spot where the
constant was missing and so it is not able to act as Ruby would. In particular,
if `Admin::User` is autoloadable, it will get autoloaded in either case.
@@ -853,7 +852,7 @@ updated in development mode.
Just follow the flow and use constant autoloading always, never mix autoloading
and `require`. As a last resort, if some file absolutely needs to load a certain
file by hand use `require_dependency` to play nice with constant autoloading.
-This option is rarely needed though in practice.
+This option is rarely needed in practice, though.
Of course, using `require` in autoloaded files to load ordinary 3rd party
libraries is fine, and Rails is able to distinguish their constants, so they are
@@ -1033,18 +1032,18 @@ module Hotel
end
```
-If `Hotel::Services` is known by the time `Hotel::GeoLocation` is being loaded,
+1. If `Hotel::Services` is known by the time `Hotel::GeoLocation` is being loaded,
everything works because `Hotel` belongs to the nesting when the singleton class
of `Hotel::GeoLocation` is opened, and thus Ruby itself is able to resolve the
constant.
-But if `Hotel::Services` is not known and we rely on autoloading for the
+2. But if `Hotel::Services` is not known and we rely on autoloading for the
`Services` constant in `Hotel::GeoLocation`, Rails is not able to find
`Hotel::Services`. The application raises `NameError`.
The reason is that autoloading is triggered for the singleton class, which is
-anonymous, and as we saw before, Rails only checks the top-level namespace in
-that edge case.
+anonymous, and as we [saw before](#generic-procedure), Rails only checks the
+top-level namespace in that edge case.
An easy solution to this caveat is to qualify the constant:
@@ -1084,7 +1083,7 @@ first time the `user` method is invoked. You only get the exception if the
`User` constant is known at that point, in particular in a *second* call to
`user`:
-```
+```ruby
c = C.new
c.user # surprisingly fine, User
c.user # NameError: uninitialized constant C::User