2013-03-13 229 views
0

我想知道多個節點是可以使用Rabl的渲染這樣的XML(不要問我爲什麼需要這樣混亂的結構:d):Rabl的 - 具有相同名稱的

<garbagebox> 
    <user><id>1</id></user> 
    <user><id>2</id></user> 
    <article><name>some name here</name></article> 
    <customer><rich>yes</rich></customer> 
    <article><name>some name here #2</name></article> 
</garbagebox> 

現在看起來Rabl的forbilds多具有相同名稱的單親內的節點(與收藏的例外 - 但在集合中的所有節點名稱相同)

例如,如果我這樣做水木清華這樣的:

object :garbagebox 
child(Country.first) {attributes :id, :currency} 
child(Customer.last) {attributes :id, :name} 
child(Country.first) {attributes :id, :currency} 

我只得到2孩子而不是3.

有人可以提供任何提示,所以我可以渲染這樣的XML嗎?謝謝。

回答

1

這是一個硬核猴子補丁。需要您自擔風險使用它。

變更前:

object @user 
child(@user) { attribute :name } 
child(@user) { attribute :city } 
child(@user) { attribute :name } 

結果:

<?xml version="1.0" encoding="UTF-8"?> 
<user> 
    <user> 
    <name>leo</name> 
    </user> 
</user> 

猴子補丁:

module Rabl 
    module Helpers 
    alias_method :data_name_without_uniquify, :data_name 
    def data_name(data_token) 
     uniquify(data_name_without_uniquify(data_token)) 
    end 

    private 

    def uniquify(object) 
     Uniquificator.new(object) 
    end 

    class Uniquificator 
     def initialize(object) 
     @object = object 
     end 

     def ==(other) 
     false 
     end 

     def hash 
     @object.hash 
     end 

     def eql?(other) 
     false 
     end 

     def to_s 
     @object.to_s 
     end 

     def method_missing(*args, &block) 
     @object.__send__(*args, &block) 
     end 
    end 
    end 
end 

,並導致修補後:

<?xml version="1.0" encoding="UTF-8"?> 
<user> 
    <user> 
    <name>leo</name> 
    </user> 
    <user> 
    <city>LA</city> 
    </user> 
    <user> 
    <name>leo</name> 
    </user> 
</user> 
+0

謝謝,看看你在這裏做了什麼;)。將等待一段時間的解決方案,這不是monkeypatch,如果沒有來 - 將接受這個答案。 – bigoldbrute 2013-03-13 20:19:07