2016-03-25 12 views
0

私はRubyでロック後にロックを打っていますが、私は戦い続けます。 今日私は属性を識別する問題があります。クラス属性のクラスを見つけるのに最適な方法

私はオブジェクトをJSONにシリアル化する作業をしています。私のオブジェクトは次のようになります。属性ItemsはItemオブジェクトが内部にあるオブジェクトで、アドレスはオブジェクトです。

module OrderSet 
    class OrderObject 

    attr_accessor :items, :url, :email, :address, :id 

    def initialize args = nil 
     if args != nil 
     args.each do |k, v| 
      instance_variable_set("@#{k}", v) unless v.nil? 
     end 
     end 
    end 

    def to_json 
     hash = {} 
     self.instance_variables.each do |var| 
     # [1..-1] is to get rid of the leading @ from instance variables. This is so the API knows the variables. 
     hash[var[1..-1]] = self.instance_variable_get var 
     end 
     hash.to_json 
    end 
    end 
end 

私はこれをシリアル化した場合、それは混乱して申し訳ありません。このようなJSON(で終わるが、それは有効なJSONでないとして、それはフォーマットしないだろう...:

"{"address":"{\"name\":\"Ruby\",\"line1\":\"StoneStreet\",\"city\":\"Gemstones\",\"country\":\"The WOrld\",\"postCode\":\"4004VC\"}","items":"[\"{\\\"productId\\\":\\\"canvas_a60x60\\\",\\\"files\\\":\\\"{\\\\\\\"content\\\\\\\":\\\\\\\"http://i.imgur.com/uHZfjIU.jpg\\\\\\\"}\\\",\\\"quantity\\\":10,\\\"pageCount\\\":1,\\\"metaData\\\":\\\"test\\\"}\"]","email":"[email protected]"}" 

方法。

: は "{"address":"{"name":"Ruby", "line1":"StoneStreet", "city":"Gemstones", "country":"The WOrld", "postCode":"4004VC" }","items":"["{
"productId":"canvas_a60x60", "files":"{"content":"http://i.imgur.com/uHZfjIU.jpg" }","quantity":10, "pageCount":1, "metaData":"test" }"]", "email":"[email protected]" }"

今、各クラスは、独自のto_jsonをメソッドを持っている、それが呼び出されorigional to_jsonをメソッドのハッシュに置かれる必要がある、私はいくつかの解決策が出ている:それは見てする必要があります

  1. object.is_a?(ClassName)
  2. を拡張、1つのベースオブジェクトを作るために(最初のものは仕方長い第2の1以上であるので、私は、合計で約20クラスを含む、4つのモジュールを持っている)
  3. モジュールをチェックしてくださいそれ以外のすべてのオブジェクトは、それがベースオブジェクトの子であるかどうかを確認し、それに応じてto_jsonを呼び出す(to_jsonを小道に入れて)
  4. 静的メソッドかもしれないが、 instance_variables

[編集] woops、質問をするのを忘れた、上記のいずれかよりも良い方法がありますか?そうでない場合は、上記のうちどれがベストですか?

+0

これらの項目のクラスとJSONのシリアル化を確認することの関係は何ですか? –

+0

@FrederickCheung属性内にあるクラス(独自の属性を持つ)が適切にシリアル化されないこと。提供されたJSONを見ると、バックスラッシュのボートロードが表示されます。これらは、自分のオブジェクトにのみ発生し、属性に追加されます。しかし、それは私が必要なものではありません。 私は指定されたJSONを有効にして、それをどのように見えるようにするかを指定します。その後、あなたは見ることができます。 –

+0

あなたの出力は、to_jsonを呼び出して値がすでに生成されたハッシュに対してto_jsonを呼び出したかのように見えます。おそらく、子クラスのto_jsonの実装には問題があります。 –

答えて

1

あなたはメタプログラミングの多くを使用しているので、簡単なテストとして、試してみて、何を期待していることは、実際にすべてのことの下で起こっている書き込みは:

def to_json 
    hash = {} 
    hash["address"] = @address 
    hash.to_json 
end 

そこから、試してみて、どこ把握あなたのバグです。

編集:例えば

class Address 
    def to_json(options={}) 
    {"name" => "foo"}.to_json 
    end 
end 

order_set = OrderSet::OrderObject.new({"address" => Address.new }) 
order_set.to_json 

は、これはあなたが後にしている何ですか?

module JSONable 
    def to_json(options={}) 
    hash = {} 
    self.instance_variables.each do |var| 
     hash[var[1..-1]] = self.instance_variable_get var 
    end 
    hash.to_json 
    end 
end 


class Address 
    include JSONable 
    # Rest of code 
end 
+0

私はクラスとメソッドを探してみました。ネストされたオブジェクトがない限り、すべてが計画どおりに行われます。しかし、オブジェクトが再生に来ると...それは動作しません... –

+0

ああ私はそれをテスト参照してください。 Addressオブジェクトには、to_jsonメソッドが必要です。これは、hashクラスのto_jsonを呼び出すときに必要です.Fredrick Cheungは正しいです。おそらくAddressクラスのto_jsonメソッドのバグです。 JSON.parseはテストにも適しています。 – jeremy04

+0

これはまったく同じto_jsonメソッドなので、私の質問にはDRYのほうが1つだけで、メインクラスを作成してto_jsonをそこに移動すると、どこでも同じコードが少なくなります。 –

関連する問題