我正在将 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)
问题出在新的 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或逗号字符的类名属性。,但在某些情况下,这可能会导致错误,因此请在点击提交之前仔细检查替换!
| 归档时间: |
|
| 查看次数: |
648 次 |
| 最近记录: |