module ActionView::Helpers::RenderingHelper

def _layout_for(*args, &block)



Hello David


would be
and the struct specified would be passed into the block as an argument. The result
In this case, the layout would receive the block passed into render :layout,


<%= yield Struct.new(:name).new("David") %>

# The layout

<% end %>
Hello <%= customer.name %>
<%= render layout: "my_layout" do |customer| %>
# The template

Finally, the block can take block arguments, which can be passed in by +yield+:


Content


would be
this method returns the block that was passed in to render :layout, and the response
In this case, instead of the default block, which would return content_for(:layout),


<%= yield %>

# The layout

<% end %>
Content
<%= render layout: "my_layout" do %>
# The template

The user can override this default by passing a block to the layout:

If the user calls simply +yield+, the default block returns content_for(:layout).
yield :some_name, the block, by default, returns content_for(:some_name).
You can think of a layout as a method that is called with a block. If the user calls

name or a block.
passed to a partial. Returns the contents that are yielded to a layout, given a
Overwrites _layout_for in the context object so it supports the case a block is
def _layout_for(*args, &block)
  name = args.first
  if block && !name.is_a?(Symbol)
    capture(*args, &block)
  else
    super
  end
end