BackEnd

Rails5で出力される「alias_method_chain is deprecated.」について

投稿日:2017年3月13日 更新日:

はじめに

直近のプロジェクトではRails5を使っているのですが、利用しているgem関連で下記のような警告が大量に出力されるので、少し調べてみました。
(「./bin/rails c」や「./bin/bundle exec rspec」を実行すると大量に出力されます。)

これは、Rails5からはActiveSupportのalias_method_chainが非推奨(deprecated)になり、代わりにModule#prependを使うように促しています。

alias_method_chainとは

まず、deprecatedになったalias_method_chainですが、下記のように利用します。

上記のコードは、alias_methodを使った場合は、下記と同等になります。

  • helloメソッドがhello_with_worldメソッドに置き換わる。
  • 元々のhelloメソッドはhello_without_worldメソッドとして使えるようになる。

実行結果を下記に記載しますが、置き換わっているのがわかると思います。

Module#prependとは

逆に推奨されているModule#prependの使い方ですが、下記のように使います。

  • prependされた HelloWithWorldモジュール は、継承関係上 HelloUser クラスより手前に位置することになる。
  • そのため、helloメソッドをオーバーライドしたような形になる。
  • HelloWithWorldモジュール のメソッド内でsuperを呼び出すことで、元々のメソッドを呼び出すことができる。

実行結果とancestorsメソッドで継承関係を表示しておきます。
ちなみにancestorsメソッドは、クラスやモジュールのスーパークラスとincludeしているモジュールを、優先順で配列に格納して返してくれます。

Rubyリファレンス-Module#ancestors-

HelloWithWorld が HelloUser の前にあるのがわかると思います。

モンキーパッチなどを書くときに利用することになると思います。
(モンキーパッチなんて書かずに、githubにプルリクする方がよいですが。。。)

とりあえず、DEPRECATION WARNINGの出力をなくしたい

Rails5にしたものの、全てのgemに対して、この警告を消すための書き換えの対応をしていくのは大変。

この出力が目障りという方は、 config/application.rb に追記すれば、消すことができます。
(ただし、自己責任でお願いします。)

 

さいごに

deprecatedなメソッドは、今後のアップデートで利用できなくなることもありますので、しっかりと理解した上で利用し、可能であれば、置き換えていくようにしましょう。

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。

関連記事

Go言語

GoでStructのAccessorを自動生成する

はじめに DDDを採用しているとあるプロジェクトでは、structのfieldをprivateにしているため、手動で定義したGetterを介して各fieldにアクセスしています。Copilotによって ...

laravel logo

Laravel SailでDocker環境構築

はじめに Laravel Sailは、2020年末に正式版となった、Laravel公式のローカルDocker環境と、Docker環境を便利に使用できるコマンド群です。Laravel公式ドキュメントでも ...

Rust入門してみた その3 Enum / match / Option編

はじめに 前回に引き続き、Rustの入門編です。今回はEnumについて調べました。 Enum Rustでは enumキーワードによってEnumを定義することが出来ます。 Enumの定義 まずは、簡単な ...

Go言語

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとある案件では、CRUD操作はsqlcで生成したORMを使い、QueryServiceではgoquを使ってクエリを組み立てています。 以前の記事ではsqlcについて紹介しまし ...

laravel logo

Server-Side Eventsを触ってみた

はじめに 最近リアルタイム通信を行う事が出来るServer-Side Events (SSE)という技術について触れる事があったので、紹介したいと思います。 Server-Side Events(SS ...

フォロー

blog-page_side_responsive

2017年3月
日 月 火 水 木 金 土
 1234
567891011
12131415161718
19202122232425
262728293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。