Skip to content

Instantly share code, notes, and snippets.

@sj26
Created April 9, 2011 14:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sj26/911446 to your computer and use it in GitHub Desktop.
Save sj26/911446 to your computer and use it in GitHub Desktop.
Nice nested layouts -- this does what *I* expect, at least.
= inside_layout :application do
%section.admin
%header ...
= yield
%footer
class AdminController < ApplicationController
layout :admin
def index
render :dashboard
end
end
!!!
%html
%head ...
%body
%header ...
= yield
%footer ...
module NestedLayoutsHelper
# Wrap some content inside a layout
def inside_layout(layout, &block)
layout = layout.to_s
layout = layout.include?('/') ? layout : "layouts/#{layout}"
controller.render_to_body(:layout => layout, :text => capture { block.call(@_content_for[:layout]) })
end
end
@zealoushacker
Copy link

Thanks for this good work! Have you seen this one? https://gist.github.com/907555

What are your thoughts on advantages and disadvantages?

Best,
Alex

@sj26
Copy link
Author

sj26 commented Jul 24, 2011

I use a custom branch of justinfrench's nestive these days: https://github.com/sj26/nestive

I like the default to "application" for layout, but it doesn't take rending inside templates outside the layouts directory into account. It also double-renders the HAML output as ERB. render :inline => ... will render the provided content as ERB, not just place it inside the layout, it should use :text. It also won't do nested layouts within nested layouts unless you use content_for[:layout]. I probably should have put that block capture a line above to make it clear that the capture happens before the render, which is important.

Check out the aforementioned branch, it handles all these cases and has nestive's excellent areas.

@zealoushacker
Copy link

Thanks for the response!

Looking at your fork: https://github.com/sj26/nestive/commits/master

So does your fork support HAML, but justinfrench's does not?

@sj26
Copy link
Author

sj26 commented Jul 24, 2011

No, nestive is template-engine agnostic.

Originally, nestive requires you to declare layout nil in your controllers and then use extends in every template. I modified it so layout "application" works as expected, with nested templating and areas available throughout.

@rwz
Copy link

rwz commented Aug 22, 2011

capture { block.call(@_content_for[:layout]) }) should to be changed to capture { block.call(content_for :layout) })

at least it worked for me in 3.1.0.rc6

@sj26
Copy link
Author

sj26 commented Aug 22, 2011

@rwz, please use nestive. It does the same thing but better. :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment