Ruby on Rails 5.2 升级 | ArgumentError(一个类已传递给 `:class_name`,但我们需要一个字符串。)

Kyl*_*iff 1 ruby-on-rails-5

我正在将 Ruby on Rails 应用程序从 5.0 升级到 5.2,并在尝试调用任何定义了关系的模型时收到此错误:

ArgumentError (A class was passed to :class_name but we are expecting a string.)
Run Code Online (Sandbox Code Playgroud)

导致问题的代码

  belongs_to :manufacturer,
             foreign_key: :org_id_mnfr,
             class_name: Organization::Manufacturer
Run Code Online (Sandbox Code Playgroud)

Kyl*_*iff 5

问题出在新的 Rails 版本上。Rails 5.2 不再接受带有该class_name:属性的不带引号的类名。您需要更改class_name:传递实际模型而不是模型名称字符串的所有实例。

例如。 Organization::Manufacturer变成'Organization::Manufacturer'

如果您的应用程序有很多像我一样的实例,您可能需要一种自动更改这些实例的方法。以下是我如何使用Atom编辑器Regex查找和替换所有实例。

查找所有启用正则表达式的内容:

在项目中查找:class_name: ([^'][\w|:]*[^'|,| |\n])

用。。。来代替:class_name: '$1'

文件/目录模式*.rb

这是做什么的:class_name查找尚未引用的 所有实例,并捕获捕获组 1 中的类名称。然后,我们将整个查找替换为静态字符串class_name:,然后将第一个捕获组用单引号括起来。

这导致:class_name: Organization::Manufacturer成为class_name: 'Organization::Manufacturer'

这可以处理后面有空格、换行符\n或逗号字符的类名属性。,但在某些情况下,这可能会导致错误,因此请在点击提交之前仔细检查替换!