All threads / How do I use nested blocks passed to a method? (metaprogramming?)
Ask A Question

Notifications

You’re not receiving notifications from this thread.

How do I use nested blocks passed to a method? (metaprogramming?)

Miguel Ricardo Gomez asked in Ruby

Hi guys! So i am totally lost with something: I need a class that creates a pseudo xml output (only nodes). This class has a builder method (a class level method) which receives a block, and according to the block it generates an output.
For example:

XmlBuilder.build { |doc| doc.my_node "2" }

returns this string:

<my_node>2</my_node>

and

DocumentBuilder.build do |doc| 
  doc.outer_node do |outer_node_builder|
    outer_node_builder.inner "2"
  end
end

returns

<outer_node><inner> 2</inner></outer_node>

I think I should override method_missing to get the name of the method (in the 1st example wuold be "my_node" and the args ("2" in the same example), but I cannot do override it.
And more important, I have no idea how to loop through the "nested" block in example 2.
If anyone has a clue, I would really appreciate your insight.
Oh, my class is written like this:

class DocumentBuilder
  def self.build
    if block_given? 
      yield
    else
      "A block should be passed to the builder"
    end
  end

  def method_missing(m, *args, &block)
    puts "override method missing"
    puts m
    puts args
    puts block
  end
end
Join the discussion

Want to stay up-to-date with Ruby on Rails?

Join 68,326+ developers who get early access to new tutorials, screencasts, articles, and more.

    We care about the protection of your data. Read our Privacy Policy.

    logo Created with Sketch.

    Screencast tutorials to help you learn Ruby on Rails, Javascript, Hotwire, Turbo, Stimulus.js, PostgreSQL, MySQL, Ubuntu, and more. Icons by Icons8

    © 2022 GoRails, LLC. All rights reserved.