Ruby でメソッドが定義されている場所を調べる方法です。
定義場所の調べ方
Ruby や Rails でコードを書いてるとメソッドのソースを見たい時があります。しかし Ruby に慣れてないとソースがどこに定義されているのか分からないことも多いです。そのような場合にMethod
やProc
クラスに定義されているsource_location
メソッドを使用することで、ソースコードと定義されている行番号が確認できます。
Method
オブジェクトを作成するにはObject#method
を使用します。
User.where(role: admin) method = user.method(:size) method.source_location => ["/Users/tasukujp/testapp/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7/lib/active_record/relation.rb", 257]
実際にソースファイルを確認すると間違いなく257行目に定義されています。
256 # Returns size of the records. 257 def size 258 loaded? ? @records.length : count(:all) 259 end ...
別のメソッドも確認してみましょう。
method = user.method(:count) method.source_location => ["/Users/tasukujp/testapp/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7/lib/active_record/relation/calculations.rb", 38]
こちらも問題ないですね。
38 def count(column_name = nil, options = {}) 39 if options.present? && !ActiveRecord.const_defined?(:DeprecatedFinders) 40 raise ArgumentError, "Relation#count does not support finder options anymore. " \ 41 "Please build a scope and then call count on it or use the " \ 42 "activerecord-deprecated_finders gem to enable this functionality." 43 44 end ...
例外として定義場所がネイティブコードの場合は nil が返却されます。
file = File.open('/Users/tasukujp/hoge.csv') method = file.method(:each_line) method.source_location => nil