所以,会发生什么:
Rails 在 ActiveSupport 中加载。ActiveSupport 将这些as_json
方法注入(猴子补丁)到几个类和模块中,包括Enumerable
:
module Enumerable
def as_json(options = nil) #:nodoc:
to_a.as_json(options)
end
end
each
对于Enumerable 要求您拥有的方法,您可能没有返回任何内容,因此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}"