从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
所以我的问题是:
add
方法会添加第二个数组元素,而该元素只是对数组本身的引用?注意:供参考,我实际上是在5.0.6上,还没有升级到5.1。
答案 0 :(得分:0)
消息存储在局部变量中,该局部变量直接引用错误实例,该错误实例也导致无限循环。我决定复制它,然后遍历数组以分别添加每条消息:
messages.dup.each { |m| record.errors.add(attribute, message: m) }
那似乎做到了!