Rails 5.1.1弃用警告changed_attributes

Alm*_*ron 12 deprecation-warning ruby-on-rails-5.1

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

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

还有这个:

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

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

我相信这是与我的验证,并after_updateafter_create在那里我用confitions像回调if: { author_id_changed? },但我不知道该怎么办他们.

我也相信该警告是与这个庞大的更新ActiveRecord的.

非常感谢你能给予的任何一手牌.

UPD

这篇文章帮了很多!

Alm*_*ron 12

好吧,通过运行bundle update和更新宝石并遵循本文并更改回调attribute_changed?中的after_调用(但不在before_回调和中validations)并切换到,attribute_was来解决所有问题attribute_before_last_save.


dee*_*pak 6

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

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

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


小智 5

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

搜索你所有的*_changed?

改变了这一点:

if name_changed?
...
if user_id_changed?
Run Code Online (Sandbox Code Playgroud)

如果它位于after_*(after_save、after_commit、after_update 等)块内:

if saved_change_to_name?
...
if saved_change_to_user_id?
Run Code Online (Sandbox Code Playgroud)

before_*如果它位于(before_save、before_commit、before_update 等)块内,则对此:

if will_save_change_to_name?
...
if will_save_change_to_user_id?
Run Code Online (Sandbox Code Playgroud)

在我看来,改变这一点是相当棘手的事情,因为我们已经习惯了attribute_changed?。但改变是好的。现在语法也更有意义了。