之前是写 python,对于别的 module 中的变量什么的,都会通过 from import 来导入才能访问。
现在看 rails,一直没习惯过来。
想问一下,rails 中在 controller 中 访问一个 model 中的 class 这个作用域或者叫 namespace 是怎么解决的? 能给详细说明一下吗?或者提供一下相关的资料。
你可以先这样理解:Rails 帮你在 Controller 中把所有的 models 全部 from import 好了。
#1 楼 @lgn21st 这个我是理解的,不求甚解就好了。 但还是希望了解一下细节。
Rails 有一种魔法叫 autoload,在串行模式(比如开发,测试环境下),autoload 相当于 lazyload,在第一次执行到这个类的时候,根据 Rails 的约定,在你的目录中把定义了这个类的文件找出来并且 load 进来(还有另一个神奇的魔法就是开发环境下它每次都会检查这个文件是否更新过,如果是则重新 load,这使得我们可以在不重启服务器的情况下修改 Rails 代码)。在并行模式下(比如生产环境下),autoload 直接将文件 require 进来,避免因为 lazyload 而造成死锁。
#2 楼 @zztczcx 可以了解一下 const_missing 这个方法。当常量找不到时,就会调用这个方法。所以可以重写这个方法,在这个方法里根据常量名加载对应的路径。楼主可以搜索 ActiveSupport::Dependencies 的实现。
production 环境下叫 eager_load,是把 app/controllers,app/models 等目录下的文件在项目初始化的时候全部加载 (在加载的过程中其实也会遇到常量找不到的情况,rails 用的是 require_dependency 方法)。避免了线程安全问题