1

私はacts_as_treeを使用するActiveRecordクラスを持っています。to_xmlメソッドを更新して、子レコードのto_xmlが呼び出された場合に、親/祖先xmlにネストされたxmlを返し、そのリソースへの完全修飾パスを提供するようにしようとしています。例として、Compiler/Versionの親であるCompilerがあります。コンパイラはxmlとしてレンダリングする必要があります。

コンパイラ/バージョンは次のようにレンダリングする必要がありますが

full_qualifiedフラグを渡すことでこれを実行しようとしましたが、「Builder :: XmlMarkup#to_aryは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(options)do | 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' _nested_structures' /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in/usr/lib/ruby/1.8/builder/xmlbase.rb:133:in method_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 not 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 に答える