【问题标题】:Rails 2: #to_xml(:methods => :method_name) when #method_name returns an ArrayRails 2:#to_xml(:methods => :method_name) 当#method_name 返回一个数组时
【发布时间】:2013-03-21 00:59:47
【问题描述】:

如果它是一个数组,是否可以覆盖 #to_xml 如何呈现方法结果?

给定#numbers 不是一个字段而是一个方法 还有@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>"

(格式化以便于阅读)

提前感谢您的建议!

【问题讨论】:

    标签: ruby-on-rails xml-serialization ruby-on-rails-2 ruby-1.8.7


    【解决方案1】:

    你有两个选择:

    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】:

      您可以使用: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
      

      【讨论】:

        猜你喜欢
        • 2012-04-30
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-15
        • 2017-12-19
        • 1970-01-01
        相关资源
        最近更新 更多