Okay, thanks. This all makes a lot more sense now. On Sun, May 2, 2010 at 5:19 PM, Nathan Weizenbaum <[email protected]> wrote:
> I'm sorry, I was mistaken. Mislav's right: you'll need to use capture_haml > to do this. The issue is that Haml doesn't actually reassign the buffer > variable within the scope of the block. > > > On Sun, May 2, 2010 at 1:50 PM, Don Sheehy <[email protected]> wrote: > >> Thanks to both Mislav and Nathan. Mislav's suggestion worked for me. I >> tried to use the common scope approach that Nathan mentions but I couldn't >> get it to work. For example I tried the following snippet: >> >> scope = Object.new >> >> def scope.layout >> >> layout_engine = Haml::Engine.new(IO.read("layout.haml")) >> layout_engine.render(self){ yield } >> >> end >> >> engine = Haml::Engine.new(IO.read("index.html.haml")) >> puts engine.render(scope) >> >> ----------OUTPUT------------ >> >> <h1>Before the container</h1> >> <h1>Inside the container.</h1> >> <div id='container'> >> false >> </div> >> >> This was actually what I had tried initially to get my head around this >> scoping pattern. Have I perhaps missed something simple? >> Thanks again, >> Don >> >> >> On Sun, May 2, 2010 at 3:29 PM, Nathan Weizenbaum <[email protected]>wrote: >> >>> 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] <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] <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] <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.
