# File lib/action_controller/base.rb, line 841
      def render(options = nil, extra_options = {}, &block) #:doc:
        raise DoubleRenderError, "Can only render or redirect once per action" if performed?

        if options.nil?
          return render_for_file(default_template_name, nil, true)
        elsif !extra_options.is_a?(Hash)
          raise RenderError, "You called render with invalid options : #{options.inspect}, #{extra_options.inspect}"
        else
          if options == :update
            options = extra_options.merge({ :update => true })
          elsif !options.is_a?(Hash)
            raise RenderError, "You called render with invalid options : #{options.inspect}"
          end
        end

        if content_type = options[:content_type]
          response.content_type = content_type.to_s
        end

        if location = options[:location]
          response.headers["Location"] = url_for(location)
        end

        if options.has_key?(:text)
          render_for_text(options[:text], options[:status])

        else
          if file = options[:file]
            render_for_file(file, options[:status], options[:use_full_path], options[:locals] || {})

          elsif template = options[:template]
            render_for_file(template, options[:status], true, options[:locals] || {})

          elsif inline = options[:inline]
            add_variables_to_assigns
            tmpl = ActionView::InlineTemplate.new(@template, options[:inline], options[:locals], options[:type])
            render_for_text(@template.render_template(tmpl), options[:status])

          elsif action_name = options[:action]
            template = default_template_name(action_name.to_s)
            if options[:layout] && !template_exempt_from_layout?(template)
              render_with_a_layout(:file => template, :status => options[:status], :use_full_path => true, :layout => true)
            else
              render_with_no_layout(:file => template, :status => options[:status], :use_full_path => true)
            end

          elsif xml = options[:xml]
            response.content_type ||= Mime::XML
            render_for_text(xml.respond_to?(:to_xml) ? xml.to_xml : xml, options[:status])

          elsif json = options[:json]
            json = json.to_json unless json.is_a?(String)
            json = "#{options[:callback]}(#{json})" unless options[:callback].blank?
            response.content_type ||= Mime::JSON
            render_for_text(json, options[:status])

          elsif partial = options[:partial]
            partial = default_template_name if partial == true
            add_variables_to_assigns

            if collection = options[:collection]
              render_for_text(
                @template.send!(:render_partial_collection, partial, collection,
                options[:spacer_template], options[:locals]), options[:status]
              )
            else
              render_for_text(
                @template.send!(:render_partial, partial,
                ActionView::Base::ObjectWrapper.new(options[:object]), options[:locals]), options[:status]
              )
            end

          elsif options[:update]
            add_variables_to_assigns
            @template.send! :evaluate_assigns

            generator = ActionView::Helpers::PrototypeHelper::JavaScriptGenerator.new(@template, &block)
            response.content_type = Mime::JS
            render_for_text(generator.to_s, options[:status])

          elsif options[:nothing]
            # Safari doesn't pass the headers of the return if the response is zero length
            render_for_text(" ", options[:status])

          else
            render_for_file(default_template_name, options[:status], true)
          end
        end
      end