# Recursion in .rhtml views?

**URL:** <https://www.ruby-forum.com/t/recursion-in-rhtml-views/90972>\
**Category:** Rails\
**Created:** [April 3, 2007, 1:55pm UTC](https://www.ruby-forum.com/t/recursion-in-rhtml-views/90972 "2007-04-03T13:55:20Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Dmitry\_Y](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c67d28/32.png) [@Dmitry\_Y](https://www.ruby-forum.com/u/Dmitry_Y)\
**Post date:** [April 3, 2007, 1:55pm UTC](https://www.ruby-forum.com/t/recursion-in-rhtml-views/90972/1 "2007-04-03T13:55:20Z")

</div>

Hi evrybdy,  
I have a very simple Albums hierarchy:

class Album \< ActiveRecord::Base  
has\_many :books  
end

It’s trivial to display a treeview in script/console:

> > def pt(a)  
> > pre=’’;a.ancestors.size.times {pre\<\<’ '}  
> > p pre+a.name  
> > a.children.each { |al| pt al }  
> > end  
> > =\> nil
> 
> > pt Album.find 1  
> > “root”  
> > " child1"  
> > " subchi1"  
> > " chi2"  
> > " subchi2"

Of course, “p” would not work inside a view, so I google for a while  
and find out about “concat”. But concat would not work either with  
"undefined \_erbout ".

I was stuck for a while until finally this came to mind:

\<%  
def print\_tree(a,out)  
pre=’’;a.ancestors.size.times {pre\<\<’ '}  
out \<\< pre+a.name+"  
"  
a.children.each { |al| print\_tree al,out }  
end

print\_tree Album.find(1), \_erbout  
%\>

So my question is: why is \_erbout out of scope in my inside method?  
And what is The Proper Rails way for recursive output? Buffer into a  
temp variable? Or something else? And why is it not possible to have  
HTML output inside method definition? (like:  
\<% def foo (bar)%\>

# \<%=bar.to\_s%\>
\<% end %\>

(disclaimer: of course I know that tail recursion is trivially reduced  
to loop. And treeview should probably be AJAX-ed)

---

<div class="post-metadata">

**Author:** ![Dmitry\_Y](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c67d28/32.png) [@Dmitry\_Y](https://www.ruby-forum.com/u/Dmitry_Y)\
**Post date:** [April 3, 2007, 2:01pm UTC](https://www.ruby-forum.com/t/recursion-in-rhtml-views/90972/2 "2007-04-03T14:01:20Z")

</div>

use partials?

\_node.erb:

- \<%= node.name %\> 
\<%= render :partial =\> 'node', :collection =\> node.children %\>

2007/4/3, Dmitry Y. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
