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

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