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
カテゴリ:
Rails