aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib')
-rwxr-xr-xactionpack/lib/action_controller/base.rb5
-rw-r--r--actionpack/lib/action_view/base.rb2
-rw-r--r--actionpack/lib/action_view/partial_template.rb9
-rw-r--r--actionpack/lib/action_view/partials.rb14
4 files changed, 18 insertions, 12 deletions
diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb
index a7b2f147e8..209cdfa686 100755
--- a/actionpack/lib/action_controller/base.rb
+++ b/actionpack/lib/action_controller/base.rb
@@ -702,6 +702,9 @@ module ActionController #:nodoc:
# # builds the complete response.
# render :partial => "person", :collection => @winners
#
+ # # Renders a collection of partials but with a custom local variable name
+ # render :partial => "admin_person", :collection => @winners, :as => :person
+ #
# # Renders the same collection of partials, but also renders the
# # person_divider partial between each person partial.
# render :partial => "person", :collection => @winners, :spacer_template => "person_divider"
@@ -889,7 +892,7 @@ module ActionController #:nodoc:
if collection = options[:collection]
render_for_text(
@template.send!(:render_partial_collection, partial, collection,
- options[:spacer_template], options[:locals]), options[:status]
+ options[:spacer_template], options[:locals], options[:as]), options[:status]
)
else
render_for_text(
diff --git a/actionpack/lib/action_view/base.rb b/actionpack/lib/action_view/base.rb
index 40b808a61e..40a3b16e9f 100644
--- a/actionpack/lib/action_view/base.rb
+++ b/actionpack/lib/action_view/base.rb
@@ -252,7 +252,7 @@ module ActionView #:nodoc:
elsif options[:file]
render_file(options[:file], use_full_path || false, options[:locals])
elsif options[:partial] && options[:collection]
- render_partial_collection(options[:partial], options[:collection], options[:spacer_template], options[:locals])
+ render_partial_collection(options[:partial], options[:collection], options[:spacer_template], options[:locals], options[:as])
elsif options[:partial]
render_partial(options[:partial], ActionView::Base::ObjectWrapper.new(options[:object]), options[:locals])
elsif options[:inline]
diff --git a/actionpack/lib/action_view/partial_template.rb b/actionpack/lib/action_view/partial_template.rb
index 0cf996ca04..3513244ecb 100644
--- a/actionpack/lib/action_view/partial_template.rb
+++ b/actionpack/lib/action_view/partial_template.rb
@@ -1,9 +1,10 @@
module ActionView #:nodoc:
class PartialTemplate < Template #:nodoc:
- attr_reader :variable_name, :object
+ attr_reader :variable_name, :object, :as
- def initialize(view, partial_path, object = nil, locals = {})
+ def initialize(view, partial_path, object = nil, locals = {}, as = nil)
@view_controller = view.controller if view.respond_to?(:controller)
+ @as = as
set_path_and_variable_name!(partial_path)
super(view, @path, true, locals)
add_object_to_local_assigns!(object)
@@ -22,10 +23,11 @@ module ActionView #:nodoc:
end
def render_member(object)
- @locals[:object] = @locals[@variable_name] = object
+ @locals[:object] = @locals[@variable_name] = @locals[as] = object
template = render_template
@locals[@counter_name] += 1
+ @locals.delete(as)
@locals.delete(@variable_name)
@locals.delete(:object)
@@ -45,6 +47,7 @@ module ActionView #:nodoc:
else
object
end || @view_controller.instance_variable_get("@#{variable_name}")
+ @locals[as] ||= @locals[:object] if as
end
def set_path_and_variable_name!(partial_path)
diff --git a/actionpack/lib/action_view/partials.rb b/actionpack/lib/action_view/partials.rb
index 6b294be6bd..7c6c98d611 100644
--- a/actionpack/lib/action_view/partials.rb
+++ b/actionpack/lib/action_view/partials.rb
@@ -123,32 +123,32 @@ module ActionView
end
end
- def render_partial_collection(partial_path, collection, partial_spacer_template = nil, local_assigns = {}) #:nodoc:
+ def render_partial_collection(partial_path, collection, partial_spacer_template = nil, local_assigns = {}, as = nil) #:nodoc:
return " " if collection.empty?
local_assigns = local_assigns ? local_assigns.clone : {}
spacer = partial_spacer_template ? render(:partial => partial_spacer_template) : ''
if partial_path.nil?
- render_partial_collection_with_unknown_partial_path(collection, local_assigns)
+ render_partial_collection_with_unknown_partial_path(collection, local_assigns, as)
else
- render_partial_collection_with_known_partial_path(collection, partial_path, local_assigns)
+ render_partial_collection_with_known_partial_path(collection, partial_path, local_assigns, as)
end.join(spacer)
end
- def render_partial_collection_with_known_partial_path(collection, partial_path, local_assigns)
- template = ActionView::PartialTemplate.new(self, partial_path, nil, local_assigns)
+ def render_partial_collection_with_known_partial_path(collection, partial_path, local_assigns, as)
+ template = ActionView::PartialTemplate.new(self, partial_path, nil, local_assigns, as)
collection.map do |element|
template.render_member(element)
end
end
- def render_partial_collection_with_unknown_partial_path(collection, local_assigns)
+ def render_partial_collection_with_unknown_partial_path(collection, local_assigns, as)
templates = Hash.new
i = 0
collection.map do |element|
partial_path = ActionController::RecordIdentifier.partial_path(element, controller.class.controller_path)
- template = templates[partial_path] ||= ActionView::PartialTemplate.new(self, partial_path, nil, local_assigns)
+ template = templates[partial_path] ||= ActionView::PartialTemplate.new(self, partial_path, nil, local_assigns, as)
template.counter = i
i += 1
template.render_member(element)