Erstellen Sie eine Ruby-Klasse zum Erstellen von (X)HTML-Dokumenten unter Verwendung von Block-Funktionen und Ruby – Metaprogrammierung.
Die resultierende Klasse soll wie folgt verwendet werden können und zudem dem der hier angehängten RSpec-Spezifikation genügen.
Überschreiben Sie die die Methode method_missing und fangen Sie damit die Aufrufe auf nicht-existierende Methoden ab. Jede nicht-existierende Methode soll zu einem Standard-HTML-Tag werden:
require 'xhtml_builder' b = XHTMLBuilder.new b.html do b.head do b.title("My Fancy Webpage") end b.body do b.h1("Fancy Title") b.p do b.b("Bold words") b.i("Followed by italic words") end b.p("Paragraph without a block") b.p do "Has a string in a block" end b.div do b.ul do 4.times do |i| b.li("This is item nr #{i}") end end end end end puts b.content
Ausgabe:
http://gist.github.com/362638
Die ausprogrammierte Idee dieser Übung ist als eigenständiges Ruby-Gem namens „Builder“ verfügbar (http://builder.rubyforge.org/).
Es ist fester Bestandteil von ActiveRecord und somit des Ruby on Rails-Frameworks. Verwendet wird es zur Bereitstellung der to_xml-Methoden von ActiveRecord-Objekten. In Rails kann jedes ActiveRecord-Objekt (Datensatz) durch Aufruf dieser Methode in einen XML-String umgewandelt werden.
Diese Übung erfordert sicherlich einiges an Denksport, ist jedoch ein hervorragendes Beispiel zur Demonstration von Block-Funktionen und Meta-Programmierung. Es wird deutlich, wie leicht es ist, Domain Specific Languages (DSLs) in Ruby zu verfasse, hat man einmal die Einstiegshürde genommen.