0
Help us understand the problem. What are the problem?

posted at

railsでclass, moduleの定義場所を探したい

はじめに

こちらの記事logger の正体を探るためにRailsモジュールの中身を見ようとしたのですが、定義ファイルを探すのが少し大変だったのでその方法をメモしておきます。

moduleの探し方

コンソールで探しているモジュールに値を再代入すると警告と一緒に定義場所のパスが出力されるのでそれを利用します。

個人的には利便性を考えて同じものを再代入するのがよいと思います。

例えば私の環境でActionControllerを探そうとすると次のようになります。

irb(main):058:0> ActionController.class
=> Module

irb(main):062:0> ActionController = ActionController
(irb):62: warning: already initialized constant ActionController
/usr/local/bundle/gems/actionpack-6.0.4.4/lib/action_controller/metal/strong_parameters.rb:13: warning: previous definition of ActionController was here
=> ActionController

classの探し方

結論

  • エディタの検索機能で探す
  • そのクラスを含んでいるモジュールの場所を探す

クラスについてもモジュールと同様の方法で探せると書かれた記事が多いですが、私が試したところうまくいかない場合が多かったです。

なのでここからは探し方についての独自の見解を書きます。間違いやもっといい方法などあればご一報いただければ幸いです。

さて、まず私はこの再代入によるクラスの定義場所の捜索は基本的に不可能だと考えています。

より正確には「そう断じて他の方法を採ったほうが良い」と考えます。

試してうまくいかなかった例を下にいくつか挙げます。

場所が表示されなかった例

irb(main):080:0> ApplicationController.class
=> Class

irb(main):084:0> ApplicationController = ApplicationController
(irb):84: warning: already initialized constant ApplicationController
(irb):37: warning: previous definition of ApplicationController was here
=> ApplicationController

定義場所ではない場所が表示された例

irb(main):008:0> ActiveRecord::Base.class
=> Class

irb(main):043:0> ActionController::Base = ActionController::Base
(irb):43: warning: already initialized constant ActionController::Base
/myapp/app/controllers/application_controller.rb:1: warning: previous definition of Base was here
=> ActionController::Base

この時表示された場所ではただ ApplicationControllerActiveRecord::Base.classを継承していただけでした。

/myapp/app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
end

参考資料

デバッグ時に定義場所を見つける方法 [Ruby]

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?