从RoR 4.2升级到5.1-在ActiveModel :: Errors消息数组中看到数组元素“ [...]”

时间:2018-12-31 01:50:01

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-5

从Rails 4.2升级到Rail 5并遇到了弃用错误:

  

不建议使用警告:ActiveModel :: Errors#set已过时,将在Rails 5.1中删除。改用model.errors.add(:foo,[“ required”]])。

好,很容易。因此我将其更改为model.errors.add(:foo, ['message']),但是随后我的一个规范开始进入无限循环(据我所知,这是由于将自引用数组传递给了渲染,然后传递了to_json方法)。

因此,我进行了一次撬动,发现模型中的错误包括一个奇怪的[...]元素:

["is required", [...]]

当我调用add方法与set方法时,会发生上述情况。另一方面,set方法仅返回["is required"] -没有第二个[...]元素。当我尝试引用该元素时-它只会返回整个数组:

> result.second
=> ["is required", [...]]

另一个有趣的发现是,当我在其上调用object_id时,它指向父数组:

> result.object_id
=> 47158376546320
> result.second.object_id
=> 47158376546320

所以我的问题是:

  1. 为什么add方法会添加第二个数组元素,而该元素只是对数组本身的引用?

注意:供参考,我实际上是在5.0.6上,还没有升级到5.1。

1 个答案:

答案 0 :(得分:0)

消息存储在局部变量中,该局部变量直接引用错误实例,该错误实例也导致无限循环。我决定复制它,然后遍历数组以分别添加每条消息:

messages.dup.each { |m| record.errors.add(attribute, message: m) }

那似乎做到了!