代码之家  ›  专栏  ›  技术社区  ›  LuisVM

当#method_name返回Array时,Rails 2:#to_xml(:methods=>:method_name)

  •  1
  • LuisVM  · 技术社区  · 12 年前

    如果方法结果是Array,是否可以覆盖#to_xml渲染方法结果的方式?

    给定的#数字不是一个字段,而是一种方法 并且@object.numbers#=>[0,1,2,3,4,5]

    目前它确实做到了:

    @object.to_xml(:methods => :numbers)
    => "<object><numbers>012345</numbers></object>"
    

    是否可以覆盖此行为,使其返回:

    @object.to_xml(:methods => :numbers)
    => "<object>
          <numbers>
            <number>0</number>
            <number>1</number>
            <number>2</number>
            <number>3</number>
            <number>4</number>
            <number>5</number>
          </numbers>
        </object>"
    

    (格式化后便于阅读)

    提前感谢您的建议!

    2 回复  |  直到 12 年前
        1
  •  0
  •   Simon Perepelitsa    12 年前

    您有两种选择:

    1. 升级至Rails 3。它已经有了想要的输出。

      gem "activemodel", '~> 3.2.12'
      require "active_model"
      
      # This could be an Active Record model
      class Result
        include ActiveModel::Serializers::Xml
      
        def numbers
          (0..5).to_a
        end
      
        def attributes
          {}
        end
      end
      
      result = Result.new
      puts result.to_xml(:methods => :numbers)
      

      输出:

      <?xml version="1.0" encoding="UTF-8"?>
      <result>
        <numbers type="array">
          <number type="integer">0</number>
          <number type="integer">1</number>
          <number type="integer">2</number>
          <number type="integer">3</number>
          <number type="integer">4</number>
          <number type="integer">5</number>
        </numbers>
      </result>
      
    2. 在完全控制输出的情况下使用XML Builder。您必须手动指定所有属性。

      # app/views/results/show.xml.builder
      xml.instruct!
      xml.result {
        xml.numbers {
          result.numbers.each do |n|
            xml.number n
          end
        }
      }
      

      输出:

      <?xml version="1.0" encoding="UTF-8"?>
      <result>
        <numbers>
          <number>0</number>
          <number>1</number>
          <number>2</number>
          <number>3</number>
          <number>4</number>
          <number>5</number>
        </numbers>
      </result>
      
        2
  •  0
  •   user1389203    11 年前

    您可以使用 :procs 选项为模型内的方法添加自定义渲染:

    def to_xml(options={})
      numbers_proc = Proc.new do |options|
        xml = options[:builder]
        xml.numbers do
          numbers.each do |n|
            xml.number n
          end
        end
      end
      super options.merge(:procs => numbers_proc)
    end