rabl - 具有相同名称的多个节点

时间:2013-03-13 17:18:40

标签: ruby-on-rails ruby xml rabl

我想知道是否有可能使用RABL来渲染xml(不要问为什么我需要这样的混乱结构:D):

<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 个答案:

答案 0 :(得分: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>

Monkey patch:

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>