17

我刚刚从 Rails 5.0.0 升级到 5.1.1 并开始收到大量的弃用警告,如下所示:

弃用警告:changed_attributesinside of after 回调的行为将在下一版本的 Rails 中改变。新的返回值将反映返回后调用方法的行为 save(例如,与现在返回的相反)。要保持当前行为,请 saved_changes.transform_values(&:first)改用。

还有这个:

弃用警告:attribute_changed?inside of after 回调的行为将在下一版本的 Rails 中改变。新的返回值将反映返回后调用方法的行为 save(例如,与现在返回的相反)。要保持当前行为,请saved_change_to_attribute? 改用。

我没有在我的项目中的任何地方明确使用这些方法,并且警告主要指向我的模型上的创建和更新调用。

我相信这与我的验证和after_update回调after_create有关,我使用类似的条件,if: { author_id_changed? }但我不知道如何处理它们。

我也相信这个警告与ActiveRecord的大规模更新有关。

将不胜感激您可以为此提供的任何帮助。

UPD

这篇文章帮助很大!

4

4 回答 4

16

好吧,通过运行bundle update和更新 gem 并遵循本文并更改回调attribute_changed?中的after_调用(但不是before_回调和validations)以及attribute_wasattribute_before_last_save.

于 2017-06-20T09:23:29.603 回答
8

对于 After 回调,您可以使用saved_change_to_attribute?

对于之前的回调和验证,您可以使用will_save_change_to_attribute?

我希望这些信息会有所帮助!

于 2018-01-15T14:53:48.340 回答
5

我已经升级到Rails 5.1.6并且有相同的 DEPRECATION 警告。如果有人仍然想解决这个警告。以下是我采取的步骤:

搜索你所有的*_changed?

改变了这个:

if name_changed?
...
if user_id_changed?

如果它在after_*(after_save、after_commit、after_update 等)块内,则对此:

if saved_change_to_name?
...
if saved_change_to_user_id?

如果它在before_*(before_save、before_commit、before_update 等)块内,则与此相关:

if will_save_change_to_name?
...
if will_save_change_to_user_id?

我个人认为,自从我们习惯了attribute_changed?. 但改变是好的。语法现在也更有意义了。

于 2018-09-20T09:07:37.170 回答
3

您可以更改author_id_changed?saved_change_to_author_id?

于 2017-06-19T16:41:20.990 回答