# recursion in .rhtml views ?

**URL:** <https://discuss.rubyonrails.org/t/recursion-in-rhtml-views/11202>\
**Category:** rubyonrails-talk\
**Created:** [April 3, 2007, 11:54am UTC](https://discuss.rubyonrails.org/t/recursion-in-rhtml-views/11202 "2007-04-03T11:54:00Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Dmitry\_Yakovkin](https://avatars.discourse-cdn.com/v4/letter/d/dfb087/32.png) [@Dmitry\_Yakovkin](https://discuss.rubyonrails.org/u/Dmitry_Yakovkin)\
**Post date:** [April 3, 2007, 11:54am UTC](https://discuss.rubyonrails.org/t/recursion-in-rhtml-views/11202/1 "2007-04-03T11:54:00Z")

</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 \<blah-blah\>".

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

\<% def print\_tree(a,out) &nbsp;&nbsp;pre='';a.ancestors.size.times {pre\<\<' '} &nbsp;&nbsp;out \<\< pre+a.name+"\<br\>" &nbsp;&nbsp;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)%\> \<h1\>\<%=bar.to\_s%\>\</h1\> \<% 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:** ![Lugovoi\_Nikolai](https://avatars.discourse-cdn.com/v4/letter/l/4da419/32.png) [@Lugovoi\_Nikolai](https://discuss.rubyonrails.org/u/Lugovoi_Nikolai)\
**Post date:** [April 3, 2007, 12:00pm UTC](https://discuss.rubyonrails.org/t/recursion-in-rhtml-views/11202/2 "2007-04-03T12:00:54Z")

</div>

use partials?

\_node.erb: \<li\> &nbsp;&nbsp;\<%= node.name %\> &nbsp;&nbsp;\<ul\>\<%= render :partial =\> 'node', :collection =\> node.children %\>\</ul\> \</li\>
