0

RABL を使用して xml を次のようにレンダリングすることは可能でしょうか?

<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 は 1 つの親内で同じ名前の複数のノードを禁止しているように見えます (コレクションは例外ですが、コレクションではすべてのノードに同じ名前が付けられています)。

たとえば、次のようにすると次のようになります。

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

私は子供が3人ではなく2人しかいません。

そのようなxmlをレンダリングできるように、誰かがヒントを提供してもらえますか? ありがとう。

4

1 に答える 1

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>
于 2013-03-13T19:55:30.410 に答える