Rails rails autoload 失效

comme · 2013年10月10日 · 最后由 comme 回复于 2013年10月11日 · 2930 次阅读

今天发现应用的 autoload 功能失效了,每次修改了 controller/model 文件都必须要重启 rails server 才能生效,rails config 如下:

#Rails 3.2.13
#RAILS_ENV=development

@autoload_once_paths=[],
 @autoload_paths=
  ["APP_PATH/app/models/role.rb",
   "APP_PATH/app/models/user.rb",
   "APP_PATH/app/models/ability.rb",
   "APP_PATH/app/models/product.rb",
   "APP_PATH/app/components"],
 @cache_classes=false,
 @consider_all_requests_local=true,
 @dependency_loading=true,
 @eager_load_paths=
  ["APP_PATH/app/assets",
   "APP_PATH/app/controllers",
   "APP_PATH/app/helpers",
   "APP_PATH/app/mailers",
   "APP_PATH/app/models",
   "APP_PATH/app/worker"],
 @encoding="utf-8",

查了 ActiveSupport::Dependencies 的加载,发现只有在启动 serve 时加载过相关文件,后面在请求就不再走其流程了. 由谁遇到过?或者告诉怎样排查也可以。多谢了。

论坛有很多类似的帖子了。

已解决. 由于主机总是无缘无故死机,给主板放电后,解决了死机问题,但忘了调整系统时间,系统时间回到了 07 年。再看 rails 关于文件加载的判断:

#https://github.com/rails/rails/blob/v3.2.13/activesupport/lib/active_support/file_update_checker.rb#L65-L73
    def updated?
      current_updated_at = updated_at
      if @last_update_at < current_updated_at
        @updated_at = updated_at
        true
      else
        false
      end
    end

#https://github.com/rails/rails/blob/v3.2.13/activesupport/lib/active_support/file_update_checker.rb#L95-L102
    def updated_at #:nodoc:
      @updated_at || begin
        all = []
        all.concat @files.select { |f| File.exists?(f) }
        all.concat Dir[@glob] if @glob
        all.map { |path| File.mtime(path) }.max || Time.at(0)
      end
    end

假如修改了 model/a.rb,其并不是跟文件上次修改的时间进行对比,而是从所有监控的文件中获取最后一个修改的文件来进行对比,而由于修改了系统时间是小于监控文件的修改时间的,所以针对 a.rb 文件的改动 updated?会返回 false.从而不会触发 reload 操作

需要 登录 后方可回复, 如果你还没有账号请 注册新账号