web-dev-qa-db-ja.com

Rails 5.1.1非推奨の警告changed_attributes

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_update_および_after_create_コールバックで_if: { author_id_changed? }_のようなコンディションを使用していることと関係があると思いますが、どうすればよいかわかりません。

また、警告は this ActiveRecordへの大規模な更新に関連していると思います。

あなたがこれで与えることができるどんな手でも感謝します。

[〜#〜]更新[〜#〜]

この記事 たくさん助けてくれました!

12
Almaron

まあ、bundle updateを実行し、gemを更新し、さらに この記事 に従ってattribute_changed?コールバック(after_コールバックとvalidationsは除く)のbefore_呼び出しを変更し、attribute_wasからattribute_before_last_save

10
Almaron

Afterコールバックの場合、saved_change_to_attribute?を使用できます

Beforeコールバックと検証では、will_save_change_to_attribute?を使用できます

この情報がお役に立てば幸いです。

4
deepak

あなたは変えられる author_id_changed?からsaved_change_to_author_id?

2
akaspick

Rails 5.1.6へのアップグレードを実行しましたが、同じ廃止警告が出ています。もし誰かがまだこの警告を解決したいと思っているなら。これが私が取ったステップです:

Your*_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?に慣れているので、変更が非常に難しいことです。しかし、変化は良いです。構文も今ではより意味のあるものになりました。

1
Tophs Celestial