You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

降级Ruby与Rails后Redmine频繁报500错误(undefined method)求助

解决Rails 4.2降级带来的三个NoMethodError问题

看起来你遇到的几个问题都是从Rails 5.x降到4.2.x后出现的API兼容问题——Rails 4.2和5.x在模型变更追踪、资产路径处理上有不少方法差异,咱一个一个拆解解决:

1. ActionView::Template::Error:public_compute_asset_path未定义

这个错误出现在config/initializers/10-patches.rb的rails_asset_id方法里,原因是public_compute_asset_path是Rails 5才新增的资产路径方法,Rails 4.2里对应的是compute_asset_path。

解决方案:
打开config/initializers/10-patches.rb,找到第221行调用public_compute_asset_path的代码,把它替换成Rails 4.2支持的compute_asset_path。比如原来的代码如果是:

public_compute_asset_path(asset_path)

改成:

compute_asset_path(asset_path)

如果这段patch是针对Rails 5写的,你可能还要检查上下文是否适配Rails 4的资产处理逻辑,确保调用的是正确的模块方法。

2. Project模型:saved_change_to_parent_id?未定义

saved_change_to_*?是Rails 5引入的便捷变更追踪方法,Rails 4.2里没有这个方法,对应的替代是用previous_changes哈希来判断字段是否在保存后发生了变化。

解决方案:
打开app/models/project.rb,找到第83行的代码块,把:

if saved_change_to_parent_id?
  # 你的业务逻辑
end

替换成Rails 4.2兼容的写法:

if previous_changes.key?(:parent_id)
  # 你的业务逻辑
end

如果这段逻辑是在保存前的回调里(比如before_save),可以改用changed.include?(:parent_id)来判断字段是否有未保存的变更。

3. Version模型:saved_change_to_sharing?未定义

这个问题和上面的Project模型错误完全一致——又是Rails 5的专属方法在4.2里不存在。

解决方案:
打开app/models/version.rb,找到第371行的update_issues_from_sharing_change方法,把:

if saved_change_to_sharing?
  # 你的业务逻辑
end

替换成:

if previous_changes.key?(:sharing)
  # 你的业务逻辑
end

同样,根据回调时机调整:如果是保存前用changed.include?(:sharing),保存后用previous_changes。

总结

这些问题本质都是版本降级带来的API不兼容:你之前用的是Rails 5的语法,降到4.2后这些新增方法就不存在了。Redmine 3.4.x本身就是基于Rails 4.2开发的,所以只要把这些Rails 5专属的写法替换成4.2的对应实现,就能解决这些错误啦。

内容的提问来源于stack exchange,提问作者ibocon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:44:13