to_xml для полностью квалифицированных деревьев с использованием act_as_tree - PullRequest
1 голос
/ 19 апреля 2010

У меня есть класс ActiveRecord, который использует acts_as_tree. Я пытаюсь обновить метод to_xml, чтобы при вызове to_xml дочерней записи он возвращал ее в XML-код, вложенный в XML-файл parent / ancestor, чтобы указать полный путь к этому ресурсу. В качестве примера у меня есть компилятор, который является родителем компилятора / версии. Компилятор должен быть представлен как xml:

В то время как компилятор / версия должны отображаться как

Я пытался сделать это, передавая флаг full_qualified, но он умирает с помощью 'Builder :: XmlMarkup # to_ary должен вернуть массив'

def to_xml (options = {}, & block) параметры [: полностью_квалифицированный] || = true параметры [: отступ] || = 2 options [: builder] || = Builder :: XmlMarkup.new (: indent => options [: indent])

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

55: parent.to_xml (параметры) do | foo | lative_options = options.dup lative_options [: полностью_qualfied] = ложь lative_options [: skip_instruct] = true relative_options.delete (: строитель)

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

66: xml.parameter (: name => name, & block) конец конец

Метод отлично работает в случае с Compiler, но не работает для Compiler / Version:

/ usr / lib / ruby ​​/ 1.8 / builder / xmlbase.rb: 133: в method_missing' /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in call ' /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in _nested_structures' /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in method_missing ' app / models / parameter.rb: 66: в to_xml' app/models/parameter.rb:55:in to_xml '

1 Ответ

1 голос
/ 20 апреля 2010

Похоже, что вы не можете вызвать to_xml ни для одной единственной ассоциации.to_xml для родителя и параметра (оба отношения has_one) завершились неудачно, но если я выполнил поиск с помощью find_by_id, это сработало:

def to_xml (options = {}, & block) my_options = options.dup my_options [: полностью_qualified] =true, если my_options.has_key? (: полностью_квалифицированный) 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

end

...