2013-01-01 2 views
1

У меня есть приложение rails и класс, который я написал как часть его (не ActiveRecord или что-то еще ...). Данные хранятся в простых переменных экземпляра (строка, целые числа, массивы ...)Перечислимое изменение моего поведения `to_json`

Когда я вызываю to_json на экземпляр экземпляра, я получаю то, что ожидаю. Объект JSON, содержащий все переменные экземпляра как объекты JSON.

Однако, когда я добавить include Enumerable к определению класса, поведение to_json изменений, и я получаю пустой объект: "[]"

Любая идея, почему это? Enumerable как-то определил или отменил определение того, что влияет на to_json?

Спасибо!

+0

Проверить это [http://stackoverflow.com/questions/10292739/convert-ruby-array-of-class-into-json ] [1] [1]: http://stackoverflow.com/questions/10292739/convert-ruby-array-of-class-into-json – uokesita

ответ

1

Итак, что происходит, является:

Рельсы нагрузки в ActiveSupport. ActiveSupport впрыскивает (обезьяна патчи) эти as_json методы в несколько классов и модулей, в том числе Enumerable:

module Enumerable 
    def as_json(options = nil) #:nodoc: 
    to_a.as_json(options) 
    end 
end 

Вы, вероятно, возвращая ничего для each метода Enumerable требует от вас есть, так 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}" 

 Смежные вопросы

  • Нет связанных вопросов^_^