Why does Ruby Builder::XmlMarkup add inspect tag to xml?

builder, ruby, xml

Solution

Builder implements a version of `method_missing` that adds tags given by the name of the method call.

Assuming you are playing in irb (or rails' console), irb's default behaviour when you evaluate an expression (such as `Builder::XmlMarkup.new`) is to call `inspect` on it, in order to generate a string to show to you. In the case of builder, `inspect` isn't the usual ruby `inspect` method - it falls through to `method_missing` and adds the tag.

This will only happen when playing with ruby interactively. You can do stuff like

xml = Builder::XmlMarkup.new; false

Here the result of the expression is `false` so irb calls `inspect` on that and leaves your builder object alone.

It can be awkward to keep doing this continually. If you do

xml = Builder::XmlMarkup.new; false
def xml.inspect; target!; end

then `xml` will still be a builder object that display its content when inspected by irb. You won't be able to create tags called `inspect` (other than by using `tag!`) but that is usually a minor inconvenience.

Problem

I'm trying out Builder::XMLMarkup to build some xml and it keeps adding an empty element to my xml. Why does it do this and how do I stop it? ``` xml = Builder::XmlMarkup.new => <inspect/> ```

Original source