降级Ruby与Rails后Redmine频繁报500错误(undefined method)求助
看起来你遇到的几个问题都是从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

