Rails初心者がRailsの仕組みをちょこっと深堀りする方法

グローバル関数なの?変数なの?インスタンスメソッドなの?

もやもや。

普通に考えるとインスタンスメソッドのように見えるのですが、

どこで定義されてるの?
そのソースファイルはどこにあるの?

もやもや。

次から次へと疑問がわいてきて先に進めなくなってしまいました。

そんなとき、この記事を見てふとひらめきました。
メソッドの定義されている場所を探す - komagata

すかさず次ようなコマンドを打ち込んだら、疑問がいっぺんに解決しました。
$ rails c

irb(main):006:0> obj = TopController.new
=> #<TopController:0x9224c24 @_routes=nil, ...
irb(main):007:0> obj.method(:render).source_location
=> ["/var/lib/gems/1.9.1/gems/actionpack-3.2.2/lib/action_controller/metal/instrumentation.rb", 37]
そうだったのか!

さっそく
/var/lib/gems/1.9.1/gems/actionpack-3.2.2/lib/action_controller/metal/instrumentation.rb
を開いてみると、
require 'benchmark'
require 'abstract_controller/logger'

module ActionController
  # Adds instrumentation to several ends in ActionController::Base. It also provides
  # some hooks related with process_action, this allows an ORM like Active Record
  # and/or DataMapper to plug in ActionController and show related information.
  #
  # Check ActiveRecord::Railties::ControllerRuntime for an example.
  module Instrumentation

(中略) 
    def render(*args)
      render_output = nil
      self.view_runtime = cleanup_view_runtime do
        Benchmark.ms { render_output = super }
      end
      render_output
    end
あった!!

まとめ

メソッドが定義されている場所を調べるには、.suorce_locationというメソッドが便利です。

例:コントローラのrenderメソッドの定義場所を調べる
obj = TopController.new
obj.method(:render).source_location
カテゴリ: