Skip to content

Instantly share code, notes, and snippets.

@gbp
Created June 1, 2009 16:29
Show Gist options
  • Select an option

  • Save gbp/121583 to your computer and use it in GitHub Desktop.

Select an option

Save gbp/121583 to your computer and use it in GitHub Desktop.
module ApplicationHelper
class RenderWrap
def self.bind(caller, wrap, &block)
ERB.new(wrap).result(caller.instance_eval { binding(&block) })
end
end
def render(*args)
options = args.extract_options!.clone
collection = args.flatten
if wrap = options.delete(:wrap).to_s and !wrap.blank?
wrap = _pick_partial_template(wrap).source if wrap.is_a?(String) and wrap !~ /<%|%>/
RenderWrap.bind(self, wrap) do |wrapper|
@processed ||= Array.new
wrapper ||= Hash.new
wrapper.reverse_merge!(
:limit => 0,
:type => nil
)
objects = collection - @processed
objects = objects.select { |o| o.class.name == wrapper[:type].to_s.classify } if wrapper[:type]
objects = if wrapper[:limit].to_i > 0
objects.slice(0, wrapper[:limit])
else
objects.slice(0..-1)
end
@processed = @processed + objects
render objects, options
end
elsif spacer = options.delete(:spacer)
collection.collect do |object|
render object, options
end.join("#{spacer}\n")
elsif form = options.delete(:form)
collection.collect do |object|
if object.respond_to?(form.to_sym) and source = object.send(form.to_sym)
render options.deep_merge(
:inline => source.to_s,
:locals => { :object => object }
)
else
render object, options
end
end
else
args << options
super
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment