##はじめに
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