从Rails 3迁移到Rails 7后/lib目录下.rb文件加载错误
Rails7升级后lib/tools.rb报错的解决办法
问题原因
Rails7默认使用Zeitwerk作为自动加载器,它遵循严格的命名约定:lib/tools.rb这个文件名必须对应定义Tools模块或类。你的文件里只定义了全局函数,没有创建Tools常量,所以第一次加载时Zeitwerk会抛出检查错误。但报错发生时,文件代码其实已经执行完毕,全局函数已经被添加到顶层命名空间中;刷新页面时,这些函数已经存在,且Zeitwerk不会重复触发对该文件的检查,因此不再报错。
解决方案
方案一:遵循Zeitwerk约定(推荐)
把全局函数封装到Tools模块中,既符合Rails7的自动加载规范,也便于代码管理:
# lib/tools.rb require "matrix" module Tools def self.first_function(t,p1,p2) # 原函数代码 end def self.last_function(t,p1,p2) # 原函数代码 end end
后续调用函数时改为Tools.first_function(...)即可。
方案二:保留全局函数,手动加载文件
如果不想修改原有调用方式,可关闭Zeitwerk对该文件的自动处理,改为手动加载:
打开config/application.rb,添加以下代码:
# 从自动加载路径中移除lib(若之前配置过lib自动加载) config.autoload_paths -= %W(#{config.root}/lib) # 手动加载tools.rb文件 require "#{config.root}/lib/tools.rb"
方案三:让Zeitwerk忽略该文件
在config/application.rb中配置,让Zeitwerk跳过对该文件的常量检查,再手动加载:
# 让自动加载器忽略tools.rb的检查 Rails.autoloaders.main.ignore("#{config.root}/lib/tools.rb") # 手动加载文件 require "#{config.root}/lib/tools.rb"
内容的提问来源于stack exchange,提问作者kranz
相关产品推荐
相关产品推荐

