Redmine插件服务未加载咨询:版本差异与自动加载路径疑问
分析你的Redmine插件加载问题
先直接回应你的三个问题,再给出具体解决方案:
1. Redmine插件服务是否普遍可用?
Redmine的插件生态是相当成熟且普遍可用的,只要插件代码适配目标Redmine版本,就能正常运行。你遇到的问题并非插件本身不可用,而是跨版本兼容性问题——你的插件在Redmine 4.0.4下适配良好,但在3.4.2这个旧版本中存在加载逻辑不兼容的情况。
2. 是否需要配置自动加载路径?
是的,这很可能是你报错的核心原因!
你看到的NameError (uninitialized constant TimesController::SearchTimes),本质是Redmine(底层基于Rails)的自动加载机制没找到SearchTimes这个类。这里的关键差异在于:
- Redmine 4.0.4基于Rails 5.2,它的自动加载机制会默认扫描
app/services这类目录(如果你的SearchTimes是服务类的话); - 而Redmine 3.4.2基于Rails 4.2,它不会自动识别
app/services这类自定义目录,必须手动配置加载路径。
解决方法是在你的插件根目录的init.rb文件中添加以下代码,把自定义类所在的目录加入自动加载路径:
# 获取插件根目录路径 plugin_root = File.dirname(__FILE__) # 添加需要自动加载的目录(根据你的实际目录调整,比如services、models子目录) RedmineApp::Application.config.autoload_paths += Dir["#{plugin_root}/app/services/**/"] RedmineApp::Application.config.eager_load_paths += Dir["#{plugin_root}/app/services/**/"]
如果SearchTimes在其他目录(比如app/models下的子目录),对应修改路径即可。
3. 是否存在版本差异问题?
绝对存在,这是根本原因!
Redmine 3.4.x和4.0.x之间有不少关键变化:
- 底层Rails版本差异:3.4用Rails 4.2,4.0用Rails 5.2,两者的常量自动加载规则、API细节有明显区别;
- Redmine自身API变化:控制器继承、钩子机制、模型关联的一些写法在两个版本中可能不兼容;
- 目录结构默认加载规则:如前面提到的,Rails 5.2会自动识别更多目录,而Rails 4.2需要手动配置。
额外调试建议
如果配置加载路径后还是报错,可以尝试:
- 在
times_controller.rb顶部手动引入常量(作为临时调试手段):
require_dependency 'search_times'
- 检查
SearchTimes的文件名是否符合Rails命名规范——类名SearchTimes对应的文件名应该是search_times.rb,且放在你配置的加载目录下。
内容的提问来源于stack exchange,提问作者chmich
相关产品推荐
相关产品推荐

