How to work with nested methods correctly
I am trying to figure out how to pass parent arguments to child arguments of a nested method block
so I would like to do something like
namespace "top" do
namespace "middle" do
namespace "bottom" do
end
end
end
what I would like to have is to create a @namespaces
var that stores each concated with its parent
def namespace(path, &block)
(@namespaces ||= []) << [parent,path].join('/')
instance_exec(block) if block_given?
end
I would like the value of @namespaces to be
[
"top",
"top/middle",
"top/middle/bottom"
]
so the issue ... I can not figure out how to get the parent path of the outer method (or pass it to the child block)
any ideas?
Certainly! You can modify your namespace method to take the parent path as an argument and concatenate it with the current path. Here's a solution:
def namespace(path, parent_path = "", &block)
full_path = [parent_path, path].reject(&:empty?).join('/')
(@namespaces ||= []) << full_path
instance_exec(full_path, &block) if block_given?
end
namespace "top" do |top_path|
namespace "middle", top_path do |middle_path|
namespace "bottom", middle_path
end
end
puts @namespaces
Output:
[
"top",
"top/middle",
"top/middle/bottom"
]
This code uses the instance_exec method to pass the concatenated path to the next level of the block, which helps you create the desired @namespaces array.