Rails 5.1.1 弃用警告 changed_attributes

Rails 5.1.1 deprecation warning changed_attributes

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

DEPRECATION WARNING: The behavior of changed_attributes inside of after callbacks will be changing in the next version of Rails. The new return value will reflect the behavior of calling the method after save returned (e.g. the opposite of what it returns now). To maintain the current behavior, use saved_changes.transform_values(&:first) instead.

还有这个:

DEPRECATION WARNING: The behavior of attribute_changed? inside of after callbacks will be changing in the next version of Rails. The new return value will reflect the behavior of calling the method after save returned (e.g. the opposite of what it returns now). To maintain the current behavior, use saved_change_to_attribute? instead.

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

我相信这与我的验证以及 after_updateafter_create 回调有关,我在其中使用 if: { author_id_changed? } 之类的条件,但我不知道如何处理它们。

我还认为该警告与 this 对 ActiveRecord 的大规模更新有关。

如果您能为此提供帮助,我们将不胜感激。

UPD

This article帮了大忙!

您可以将 author_id_changed? 更改为 saved_change_to_author_id?

好吧,通过 运行 bundle update 和更新 gems 并遵循 this article 并更改 after_ 回调中的 attribute_changed? 调用(但是不在 before_ 回调和 validations) 中,并从 attribute_was 切换到 attribute_before_last_save.

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

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

希望这些信息对您有所帮助!

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

搜索你所有的*_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?

AND 如果它在 before_* 内(before_save、before_commit、before_update 等)块:

if will_save_change_to_name?
...
if will_save_change_to_user_id?

我个人认为,由于我们已经习惯了 attribute_changed?,因此更改这件事非常棘手。但改变是好的。语法现在也更有意义了。