2019-1-27 解决烦人的 Rails autoload 问题。app/services/ 里的代码在开发环境下没有自动重载

app/下的代码都会自动 reload

这篇文讲什么

Rails 5.2 版本下,app/services/ 下的代码没有 autoload 的问题,
改一点代码就要 Ctrl+C 关掉,然后再 rails s 开启服务器。非常烦。大大拖慢开发速度。
本文讲怎么解决这个问题

错误的代码:

文件路径 app/services/paylix.rb
文件内容

module Paylinx
    module_function
    def y
        return '1'
    end
end

为了方便测试,我们简单写一个 route + controller

route

get 'test/paylinx', to: "test#paylinx"

controller

app/controllers/test_controller.rb

class TestController < ApplicationController
  require 'paylinx_service'
  def paylinx
    paylinx = Paylinx::y
    render plain: result
  end
end

访问 localhost:3000/test/paylinx 会输出 1.
但是如果改成 return '123'
刷新后没有反应。
这不是我们想要的效果。

正确的代码

文件路径 app/services/paylix/paylinx_service.rb
文件内容

module Paylinx
    class PaylinxService
        def y
            return 'aaa'
        end
    end
end

访问 localhost:3000/test/paylinx 会输出 aaa。
改成 return 'bbb'
刷新可以看到输出 bbb。
这是我们想要的效果。

还有

我的配置文件 config/enviroments/development.rb
没有写 autoload_paths 或者 eager_load_paths
我都注释掉了。

# config.autoload_paths += Dir[Rails.root.join('app', 'services')]
# config.eager_load_paths << Rails.root.join('app', 'services')

结论

文件路径 + 文件内的定义方式,俩都要改。