Builder機能の委任
たとえば、親ビルダーは、子ビルダーがドキュメントのより小さな部分を作成するように設定する関数を呼び出します
ビルダーの現在の状態を取得して使用するメソッドに責任を簡単に委任できます。例えば:
require 'nokogiri'
def add_kids_for(name,xml)
xml.send(name){ 1.upto(3){ |i| xml.kid("#{name}'s kid ##{i}") } }
end
build = Nokogiri::XML::Builder.new do |xml|
xml.root do
add_kids_for("Danny",xml)
add_kids_for("Billy",xml)
end
end
puts build.to_xml
#=> <?xml version="1.0"?>
#=> <root>
#=> <Danny>
#=> <kid>Danny's kid #1</kid>
#=> <kid>Danny's kid #2</kid>
#=> <kid>Danny's kid #3</kid>
#=> </Danny>
#=> <Billy>
#=> <kid>Billy's kid #1</kid>
#=> <kid>Billy's kid #2</kid>
#=> <kid>Billy's kid #3</kid>
#=> </Billy>
#=> </root>
xml
(またはビルダーオブジェクトと呼ぶものは何でも)メソッドに渡し、そのメソッドに必要なことを(手続き的または手動で)実行させます。
作成後のビルダーの変更
または、ブロックが終了した後にビルダーを変更する方法はありますか?
はい!:)あなたはそれを運転するdoc
ためにビルダーのメソッドにしたいと思います。Nokogiri::XML::Document
上記の例を実行します。
doc = build.doc
doc.css('kid').each do |kid|
kid['name'] = %w[Bobby Jenny Jill Sam Gish Gavin Lisa Imogen Lachlan].sample
end
puts doc
#=> <root>
#=> <Danny>
#=> <kid name="Lisa">Danny's kid #1</kid>
#=> <kid name="Imogen">Danny's kid #2</kid>
#=> <kid name="Lachlan">Danny's kid #3</kid>
#=> </Danny>
#=> <Billy>
#=> <kid name="Gish">Billy's kid #1</kid>
#=> <kid name="Gavin">Billy's kid #2</kid>
#=> <kid name="Sam">Billy's kid #3</kid>
#=> </Billy>
#=> </root>