module Padrino::Helpers::RenderHelpers

Helpers related to rendering within templates (i.e partials).

Public Instance Methods

partial(template, options={}, &block) click to toggle source

Render a partials with collections support.

@param [String] template

Relative path to partial template.

@param [Hash] options

Options hash for rendering options.

@option options [Object] :object

Object rendered in partial.

@option options [Array<Object>] :collection

Partial is rendered for each object in this collection.

@option options [Hash] :locals ({})

Local variables accessible in the partial.

@option options [Symbol] :engine

Explicit rendering engine to use for this partial.

@return [String] The html generated from this partial.

@example

partial 'photo/item', :object => @photo
partial 'photo/item', :collection => @photos
partial 'photo/item', :locals => { :foo => :bar }
partial 'photo/item', :engine => :erb

@note If using this from Sinatra, pass explicit :engine option

# File lib/padrino-helpers/render_helpers.rb, line 33
def partial(template, options={}, &block)
  options = { :locals => {}, :layout => false }.update(options)
  explicit_engine = options.delete(:engine)

  path,_,name = template.to_s.rpartition(File::SEPARATOR)
  template_path = File.join(path,"_#{name}").to_sym
  object_name = name.partition('.').first.to_sym

  objects, counter = if options[:collection].respond_to?(:inject)
    [options.delete(:collection), 0]
  else
    [[options.delete(:object)], nil]
  end

  locals = options[:locals]
  objects.each_with_object(ActiveSupport::SafeBuffer.new) do |object,html|
    locals[object_name] = object if object
    locals["#{object_name}_counter".to_sym] = counter += 1 if counter
    content =
      if block_given?
        concat_content render(explicit_engine, template_path, options){ capture_html(&block) }
      else
        render(explicit_engine, template_path, options)
      end
    html.safe_concat content if content
  end
end
Also aliased as: render_partial
render_partial(template, options={}, &block)
Alias for: partial