我刚从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帮助很多!
答案 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?
,因此要更改这是一件非常棘手的事情。但是改变是好的。现在,语法也变得更有意义了。