module AbstractController::Rendering

def _normalize_args(action=nil, options={})

render "foo/bar" to render :file => "foo/bar".
Normalize options by converting render "foo" to render :action => "foo" and
def _normalize_args(action=nil, options={})
  case action
  when NilClass
  when Hash
    options, action = action, nil
  when String, Symbol
    action = action.to_s
    key = action.include?(?/) ? :file : :action
    options[key] = action
  else
    options.merge!(:partial => action)
  end
  options
end

def _normalize_options(options)

def _normalize_options(options)
  if options[:partial] == true
    options[:partial] = action_name
  end
  if (options.keys & [:partial, :file, :template]).empty?
    options[:prefix] ||= _prefix
  end
  options[:template] ||= (options[:action] || action_name).to_s
  options
end

def _prefix

The prefix used in render "foo" shortcuts.
def _prefix
  controller_path
end

def _process_options(options)

def _process_options(options)
end

def _render_template(options) #:nodoc:

:nodoc:
:api: private
Find and renders a template based on the options given.
def _render_template(options) #:nodoc:
  view_context.render(options)
end

def initialize(*)

def initialize(*)
  @view_context_class = nil
  super
end

def process(*) #:nodoc:

:nodoc:
Overwrite process to setup I18n proxy.
def process(*) #:nodoc:
  old_config, I18n.config = I18n.config, I18nProxy.new(I18n.config, lookup_context)
  super
ensure
  I18n.config = old_config
end

def render(*args, &block)

sticks the result in self.response_body.
Normalize arguments, options and then delegates render_to_body and
def render(*args, &block)
  self.response_body = render_to_string(*args, &block)
end

def render_to_body(options = {})

:api: plugin
Raw rendering of a template to a Rack-compatible body.
def render_to_body(options = {})
  _process_options(options)
  _render_template(options)
end

def render_to_string(*args, &block)

:api: plugin
render_to_body into a String.
Raw rendering of a template to a string. Just convert the results of
def render_to_string(*args, &block)
  options = _normalize_args(*args, &block)
  _normalize_options(options)
  render_to_body(options)
end

def view_assigns

:api: public
You can overwrite this configuration per controller.
This method should return a hash with assigns.
def view_assigns
  hash = {}
  variables  = instance_variable_names
  variables -= protected_instance_variables if respond_to?(:protected_instance_variables)
  variables.each { |name| hash[name.to_s[1..-1]] = instance_variable_get(name) }
  hash
end

def view_context

Override this method in a module to change the default behavior.

Returns String with the rendered template
View#render[options]
Create a new ActionView instance for a controller
View.new[lookup_context, assigns, controller]
The view class must have the following methods:

An instance of a view class. The default view class is ActionView::Base
def view_context
  view_context_class.new(lookup_context, view_assigns, self)
end

def view_context_class

def view_context_class
  @view_context_class || self.class.view_context_class
end