【问题标题】:Upgrading rails 4.2.8 to 5.0.x将 rails 4.2.8 升级到 5.0.x
【发布时间】:2026-02-12 20:25:02
【问题描述】:

我正在将使用 rails 4.2.8 构建的旧 Rails 应用程序升级到 rails 5.0.x(试用过 rails 5.0.1 和 5.0.7 版本并遇到同样的问题)。

基础 Rails 应用程序升级顺利,我的基础 Rails 应用程序运行良好。但是,有一个内置 angular 的前端应用程序和一个使用 nodejs 构建的前端应用程序,它们具有一些通信通道,如 api 和一些控制器来与基本 Rails 应用程序通信。

我在其中一个在线控制器中遇到问题:

  render(:json =>  result, methods: [:mdobjectsAttributes, :blockAttributes, :entityFormTemplateBlock], :status => 200, :errorCode => 0, :layout => false)

错误是:

NoMethodError (undefined method `mdobjectsAttributes' for #Formtemplateblock:0x000055d7ff2a6480>):

所以,我知道我需要更新/更改 attr_accessible 和 attr_protected 功能以支持强参数。我在模型中看到它们,但我不确定这是否对 response methods 左右有影响...我确实更新模型以使用 ApplicationRecord 而不是 ActiveRecord::Base

另外,我确实将jbuilder 更新为最新版本2.11.x

那么,对于解决方案有什么建议吗?显然我错过了什么?

这是显示错误的模型和控制器的预览。

【问题讨论】:

  • 这与强参数无关。强参数仅用于在创建和更新资源时将传入参数列入白名单,以便批量分配给模型实例。它与 JSON 渲染完全无关。实际上很难得出任何结论,因为我们甚至不知道 :mdobjectsAttributes, :blockAttributes 应该来自哪里以及为什么命名如此不受欢迎。
  • 遗留项目......有这么多的混乱......我正在尝试将 ruby​​ 的版本从 2.4.2 升级到 2.5.1 和 rails 4.2.8 到 5.xx ...... . 完成了很多工作,基本应用程序工作正常,只是几个控制器和动作看起来像上面那样。如果我将代码恢复到以前的版本,它会突然丢失方法..
  • 如果您在 git 中完成了分支,我会存储或提交您的更改,然后检查任何标签/分支正在工作并找到有问题的方法。 Github 对此也非常有用。 camelCase 告诉我,它更有可能是一些应用程序代码,然后是 gem 或框架,因此只能在给定所述代码的情况下得到。
  • 是的,我正在使用分支。该应用程序是 docker setup 的一部分。因此,当我将分支更改为旧版本的代码时,它运行良好,只是在我已经对 ruby​​ 和 rails 进行了一些升级的分支上,我遇到了问题。
  • @max 这里也是错误和控制器中提到的模型的预览。

标签: ruby-on-rails json ruby render upgrade


【解决方案1】:

在调查问题 2-3 天后,我设法通过将缺少的方法添加到所需模型作为 attr_accessor 来修复它,如下所示:

attr_accessor  :blockAttributes, :entityFormTemplateBlock...

因为我在 15 个模型中遇到了问题,我不得不通过创建 ruby​​ 模块来优化我的修复,并将其包含到所需的模型中。

rails app/lib/custom_attr_accessors.rb中的模块示例

module CustomAttrAccessors
    attr_accessor  :blockAttributes, :entityFormTemplateBlock..
end

最后将该模块包含到模型中:

class Formtemplate < ApplicationRecord
  include CustomAttrAccessors
.....

【讨论】: