我有一个rails应用程序和一个我写过的类作为它的一部分(不是ActiveRecord或任何东西......)。数据存储在简单的实例变量(字符串,整数,数组......)
中当我在它的实例上调用to_json
时,我得到了我期望的结果。一个JSON对象,也包含所有实例变量作为JSON对象。
但是,当我向类定义添加include Enumerable
时,to_json
的行为会发生变化,我会得到一个空对象:"[]"
知道为什么会这样吗? Enumerable
以某种方式定义或取消定义影响to_json
的内容吗?
谢谢!
答案 0 :(得分:1)
所以,会发生什么:
在ActiveSupport中加载Rails。 ActiveSupport将这些as_json
方法(猴子补丁)注入到几个类和模块中,包括Enumerable
:
module Enumerable
def as_json(options = nil) #:nodoc:
to_a.as_json(options)
end
end
你可能没有为each
方法返回任何内容,因为to_a
返回[]
,而"[]"
返回.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}"
方法。
像这样:
{{1}}
演示:
{{1}}