はじめに
railsを使ってモジュールを読み込むときはrequireを使っていましたが、require_dependencyなるものを聞いたので紹介します。
現象(事の発端)
railsで自作モジュールを作成してrequireで読み込んでいたのですが、モジュールを編集して再度実行するとNoMethodとなって読み込んでくれないことがありました。
スペルミスったかな?と思って確認しても間違いは見当たらず。
この原因としてrequireの処理内容を理解していなかったということがわかりました。
「require」と「require_dependency」
外部ファイル読み込み時にはおなじみの「require」と、「require_dependency」というものもあります。
この2つの特徴はざっとするとこんな感じ。
-
「require」
-
rubyの組み込み関数 - 引数で指定した
rubyファイル(.rb)を読み込む - 既に読み込み済みのファイルなら読み込まない
- キャッシュ済みの場合はそちらを読み込む
-
-
「require_dependency」
-
railsが定義した独自メソッド - 引数で指定した
rubyファイル(.rb)を読み込む - 既に読み込み済みのファイルなら読み込まない
- キャッシュ済みであっても再読み込み(
load)
-
この2つの違いは、loadを使って読み込むかどうかです。
require_dependencyは、developmentモードで実行しているときはloadを使って読み込まれます。
productionモードで実行しているときはrequireを使って読み込まれるようです。
ということで、この2つ何が違うかというと、
developmentモード時は ロード対象のrubyファイルが変更されている時に再読み込みをするかどうか が異なっています。
require_dependencyは無条件にloadするので変更点があった場合はその変更が反映されます。
開発中はよく変更がありますよね。そんなときrequire_dependencyを使っていればキャッシュしてようが再読み込みして変更点を反映してくれます。
そのままproductionモードで実行しても処理はrequireを使って読み込まれるので問題なしです。
開発中はrequire_dependencyを使うと便利ですね!
※require_dependencyはrailsの独自メソッドなのでお気をつけ下さい
おわりに
もっとrailsのコード読んで早く知っておけばよかったです。
もっと注意深く読んで見ます。
今回はこちらの記事を参考にさせてもらいました。ありがとうございます。
requireとrequire_dependencyとRuby 1.8.7とRuby 1.9.2
http://masamitsu-murase.blogspot.jp/2011/11/requirerequiredependencyruby-187ruby.html
require_dependencyとrequireの違い
http://d.hatena.ne.jp/sai-ou89/20081218/1208940536