Rails 5.1.1弃用警告changed_attributes

时间:2017-06-19 15:23:07

标签: deprecation-warning ruby-on-rails-5.1

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

  

DEPRECATION WARNING:changed_attributes内部的行为   回调后将在下一版本的Rails中进行更改。新的   返回值将反映调用该方法之后的行为   save返回(例如与它现在返回的相反)。至   保持当前的行为,使用   而是saved_changes.transform_values(&:first)

和此:

  

DEPRECATION WARNING:attribute_changed?内部的行为   回调后将在下一版本的Rails中进行更改。新的   返回值将反映调用该方法之后的行为   save返回(例如与它现在返回的相反)。至   保持当前行为,使用saved_change_to_attribute?   代替。

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

我认为它与我的验证和after_update以及after_create回调有关,我使用if: { author_id_changed? }之类的限制,但我不知道如何处理它们。

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

非常感谢你能给予的任何一只手。

UPD

This article帮助很多!

4 个答案:

答案 0 :(得分:12)

好吧,通过运行bundle update并更新宝石并跟踪this article并更改attribute_changed?回调中的after_来电(但不在{{1}中)来解决所有问题} callbacks和before_)并从validations切换到attribute_was

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

您可以将author_id_changed?更改为saved_change_to_author_id?

答案 3 :(得分:2)

我已经升级到 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?,因此要更改这是一件非常棘手的事情。但是改变是好的。现在,语法也变得更有意义了。