Mislav is correct: the yield is yielding to code that appends to the outer Haml buffer, not the inner. However, there is an easier way to handle this than with haml_capture. You just need to make sure that both the layout and the main page are rendering with the same scope object (see http://haml-lang.com/docs/yardoc/Haml/Engine.html#render-instance_method). If this is the same across both instances of Engine, the Haml buffers will be set up properly.
Note that if you're planning to use Haml to render a page during each request in a production website, you should definitely use Haml::Engine#def_method in preference to #render, and remember to cache the defined methods. On Sun, May 2, 2010 at 11:46 AM, Mislav Marohnić <[email protected]>wrote: > On Sun, May 2, 2010 at 20:15, Don <[email protected]> wrote: > >> >> def layout >> layout_engine = Haml::Engine.new(IO.read("layout.haml")) >> haml_concat layout_engine.render{ yield } >> end > > > Interesting experiment. I think it didn't work for you because the `layout > do ... end` block carried its context with it (remember closures) and when > it yielded, it still appended to the original template instead to > "layout.haml". > > In my opinion, the only way this could work is that you use `haml_capture` > to capture the actual result and pass it in a block to > `layout_engine.render`. Yeah, falling back to raw strings doesn't seem > elegant, but it might be the only solution here. I'm pretty much convinced > that's how it works in Rails views, for instance. > > -- > You received this message because you are subscribed to the Google Groups > "Haml" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected] <haml%[email protected]>. > For more options, visit this group at > http://groups.google.com/group/haml?hl=en. > -- You received this message because you are subscribed to the Google Groups "Haml" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/haml?hl=en.
