したがって、何が起こるかは次のとおりです。
RailsはActiveSupportにロードされます。ActiveSupportは、これらのas_jsonメソッドを次のようないくつかのクラスとモジュールに挿入します(モンキーパッチ) Enumerable。
module Enumerable
def as_json(options = nil) #:nodoc:
to_a.as_json(options)
end
end
eachEnumerableが必要とするメソッドに対してはおそらく何も返さないので、をto_a返し[]、空の配列をStringに変換し"[]"ます。
ここでできることは、オブジェクトを列挙不可能な継承クラスにバインドし、その.as_jsonメソッドを使用することです。
このような:
class A
def as_json(*)
Object.instance_method(:as_json).bind(self).call
end
end
デモ:
➜ pry
require 'active_support/all'
=> true
class A
def initialize
@a = 1
end
end
=> nil
A.new.to_json
=> "{\"a\":1}"
class A
include Enumerable
def each
end
end
=> nil
A.new.to_json
=> "[]"
class A
def as_json(*)
Object.instance_method(:as_json).bind(self).call
end
end
=> nil
A.new.to_json
=> "{\"a\":1}"