mirror of
https://github.com/github/rails.git
synced 2026-01-30 16:58:15 -05:00
Added partial layouts (see example in action_view/lib/partials.rb) [DHH]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7261 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
*SVN*
|
||||
|
||||
* Added partial layouts (see example in action_view/lib/partials.rb) [DHH]
|
||||
|
||||
* Allow you to set custom :conditions on resource routes. [Rick]
|
||||
|
||||
* Fixed that file.content_type for uploaded files would include a trailing \r #9053 [bgreenlee]
|
||||
|
||||
@@ -304,7 +304,17 @@ module ActionView #:nodoc:
|
||||
elsif options.is_a?(Hash)
|
||||
options = options.reverse_merge(:type => :erb, :locals => {}, :use_full_path => true)
|
||||
|
||||
if options[:file]
|
||||
if options[:layout]
|
||||
path, partial_name = partial_pieces(options.delete(:layout))
|
||||
|
||||
if block_given?
|
||||
@content_for_layout = capture(&block)
|
||||
concat(render(options.merge(:partial => "#{path}/#{partial_name}")), block.binding)
|
||||
else
|
||||
@content_for_layout = render(options)
|
||||
render(options.merge(:partial => "#{path}/#{partial_name}"))
|
||||
end
|
||||
elsif options[:file]
|
||||
render_file(options[:file], options[:use_full_path], options[:locals])
|
||||
elsif options[:partial] && options[:collection]
|
||||
render_partial_collection(options[:partial], options[:collection], options[:spacer_template], options[:locals])
|
||||
|
||||
@@ -44,6 +44,63 @@ module ActionView
|
||||
# <%= render :partial => "advertisement/ad", :locals => { :ad => @advertisement } %>
|
||||
#
|
||||
# This will render the partial "advertisement/_ad.erb" regardless of which controller this is being called from.
|
||||
#
|
||||
# == Rendering partials with layouts
|
||||
#
|
||||
# Partials can have their own layouts applied to them. These layouts are different than the ones that are specified globally
|
||||
# for the entire action, but they work in a similar fashion. Imagine a list with two types of users:
|
||||
#
|
||||
# <!-- app/views/users/index.html.erb -->
|
||||
# Here's the administrator:
|
||||
# <%= render :partial => "user", :layout => "administrator", :locals => { :user => administrator } %>
|
||||
#
|
||||
# Here's the editor:
|
||||
# <%= render :partial => "user", :layout => "editor", :locals => { :user => editor } %>
|
||||
#
|
||||
# <!-- app/views/users/_user.html.erb -->
|
||||
# Name: <%= user.name %>
|
||||
#
|
||||
# <!-- app/views/users/_administrator.html.erb -->
|
||||
# <div id="administrator">
|
||||
# Budget: $<%= user.budget %>
|
||||
# <%= yield %>
|
||||
# </div>
|
||||
#
|
||||
# <!-- app/views/users/_editor.html.erb -->
|
||||
# <div id="editor">
|
||||
# Deadline: $<%= user.deadline %>
|
||||
# <%= yield %>
|
||||
# </div>
|
||||
#
|
||||
# ...this will return:
|
||||
#
|
||||
# Here's the administrator:
|
||||
# <div id="administrator">
|
||||
# Budget: $<%= user.budget %>
|
||||
# Name: <%= user.name %>
|
||||
# </div>
|
||||
#
|
||||
# Here's the editor:
|
||||
# <div id="editor">
|
||||
# Deadline: $<%= user.deadline %>
|
||||
# Name: <%= user.name %>
|
||||
# </div>
|
||||
#
|
||||
# You can also apply a layout to a block within any template:
|
||||
#
|
||||
# <!-- app/views/users/_chief.html.erb -->
|
||||
# <% render(:layout => "administrator", :locals => { :user => chief }) do %>
|
||||
# Title: <%= chief.title %>
|
||||
# <% end %>
|
||||
#
|
||||
# ...this will return:
|
||||
#
|
||||
# <div id="administrator">
|
||||
# Budget: $<%= user.budget %>
|
||||
# Title: <%= chief.name %>
|
||||
# </div>
|
||||
#
|
||||
# As you can see, the :locals hash is shared between both the partial and its layout.
|
||||
module Partials
|
||||
private
|
||||
# Deprecated, use render :partial
|
||||
|
||||
@@ -349,6 +349,14 @@ class NewRenderTestController < ActionController::Base
|
||||
render :text => "hello world!"
|
||||
end
|
||||
|
||||
def render_call_to_partial_with_layout
|
||||
render :action => "calling_partial_with_layout"
|
||||
end
|
||||
|
||||
def render_using_layout_around_block
|
||||
render :action => "using_layout_around_block"
|
||||
end
|
||||
|
||||
def rescue_action(e) raise end
|
||||
|
||||
private
|
||||
@@ -793,4 +801,14 @@ EOS
|
||||
get :render_with_object_location
|
||||
assert_equal "http://www.nextangle.com/customers/1", @response.headers["Location"]
|
||||
end
|
||||
end
|
||||
|
||||
def test_render_call_to_partial_with_layout
|
||||
get :render_call_to_partial_with_layout
|
||||
assert_equal "Before (David)\nInside from partial (David)\nAfter", @response.body
|
||||
end
|
||||
|
||||
def test_using_layout_around_block
|
||||
get :using_layout_around_block
|
||||
assert_equal "Before (David)\nInside from block\nAfter", @response.body
|
||||
end
|
||||
end
|
||||
3
actionpack/test/fixtures/test/_layout_for_partial.html.erb
vendored
Normal file
3
actionpack/test/fixtures/test/_layout_for_partial.html.erb
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
Before (<%= name %>)
|
||||
<%= yield %>
|
||||
After
|
||||
1
actionpack/test/fixtures/test/_partial_for_use_in_layout.html.erb
vendored
Normal file
1
actionpack/test/fixtures/test/_partial_for_use_in_layout.html.erb
vendored
Normal file
@@ -0,0 +1 @@
|
||||
Inside from partial (<%= name %>)
|
||||
1
actionpack/test/fixtures/test/calling_partial_with_layout.html.erb
vendored
Normal file
1
actionpack/test/fixtures/test/calling_partial_with_layout.html.erb
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<%= render(:layout => "layout_for_partial", :partial => "partial_for_use_in_layout", :locals => { :name => "David" }) %>
|
||||
1
actionpack/test/fixtures/test/using_layout_around_block.html.erb
vendored
Normal file
1
actionpack/test/fixtures/test/using_layout_around_block.html.erb
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<% render(:layout => "layout_for_partial", :locals => { :name => "David" }) do %>Inside from block<% end %>
|
||||
Reference in New Issue
Block a user