1

我有一个使用acts_as_tree 的ActiveRecord 类。我正在尝试更新 to_xml 方法,以便如果调用子记录的 to_xml 它将返回嵌套在父/祖先 xml 中的 xml,以提供该资源的完全限定路径。例如,我有 Compiler,它是 Compiler/Version 的父级。编译器应呈现为 xml:

虽然编译器/版本应呈现为

我试图通过传递一个完全限定的标志来做到这一点,但它因 'Builder::XmlMarkup#to_ary should return Array' 而死

def to_xml(options={}, &block) options[:fully_qualified] ||= true options[:indent] ||= 2 options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:缩进])

if options[:fully_qualified] and not parent.nil?

55: parent.to_xml(选项) 做 |foo| relative_options = options.dup relative_options[:fully_qualfied] = false relative_options[:skip_instruct] = true relative_options.delete(:builder)

    foo << to_xml(relative_options)
  end
else
  xml = options[:builder]
  xml.instruct! unless options[:skip_instruct]

66: xml.parameter(:name => name, &block) end end

该方法适用于编译器的情况,但对于编译器/版本失败:

/usr/lib/ruby/1.8/builder/xmlbase.rb:133:in method_missing' /usr/lib/ruby/1.8/builder/xmlbase.rb:133:incall' /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in _nested_structures' /usr/lib/ruby/1.8/builder/xmlbase.rb:57:inmethod_missing' app/models/parameter.rb:66:在to_xml' app/models/parameter.rb:55:into_xml'

4

1 回答 1

1

看来您不能在任何单数关联上调用 to_xml。父级和参数(两个 has_one 关系)上的 to_xml 失败,但是如果我使用 find_by_id 进行查找,它就可以工作:

def to_xml(options={}, &block) my_options = options.dup my_options[:fully_qualified] = true 除非 my_options.has_key?(:fully_qualified) my_options[:only] = [:name]

if my_options[:fully_qualified] and not parent.nil?
   # do block here fails with 'Builder::XmlMarkup#to_ary should return Array'
   # if called as parent.to_xml, so call on explicit lookup of parent and
   # it works
   p = self.class.find_by_id(parent_id)
   p.to_xml(my_options) do |xml|
     relative_options = my_options.dup
     relative_options[:builder] = xml
     relative_options[:fully_qualified] = false
     relative_options[:skip_instruct] = true

     to_xml(relative_options, &block)
   end
else
  super(my_options, &block)
end

结尾

于 2010-04-19T20:54:38.707 回答