1

我有一个 Rails 应用程序和一个我作为其中一部分编写的类(不是 ActiveRecord 或任何东西..)。数据存储在简单的实例变量中(字符串、整数、数组...)

当我调用to_json它的一个实例时,我得到了我期望的结果。一个 JSON 对象,也包含所有实例变量作为 JSON 对象。

但是,当我添加include Enumerable到类定义中时,行为发生了to_json变化,我得到了一个空对象:"[]"

知道为什么吗?是否Enumerable以某种方式定义或取消定义影响的东西to_json

谢谢!

4

1 回答 1

1

所以,会发生什么:

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}"
于 2013-01-01T13:45:49.300 回答