diff options
Diffstat (limited to 'actionpack/lib')
-rwxr-xr-x | actionpack/lib/action_controller/base.rb | 172 | ||||
-rw-r--r-- | actionpack/lib/action_controller/benchmarking.rb | 4 | ||||
-rw-r--r-- | actionpack/lib/action_controller/caching.rb | 2 | ||||
-rw-r--r-- | actionpack/lib/action_controller/components.rb | 2 | ||||
-rw-r--r-- | actionpack/lib/action_controller/layout.rb | 22 | ||||
-rw-r--r-- | actionpack/lib/action_controller/rescue.rb | 2 | ||||
-rw-r--r-- | actionpack/lib/action_view/partials.rb | 22 |
7 files changed, 75 insertions, 151 deletions
diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index 353f3f7330..e0474ff5b3 100755 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -15,6 +15,8 @@ module ActionController #:nodoc: end class MissingTemplate < ActionControllerError #:nodoc: end + class RenderError < ActionControllerError #:nodoc: + end class RoutingError < ActionControllerError #:nodoc: attr_reader :failures def initialize(message, failures=[]) @@ -612,7 +614,7 @@ module ActionController #:nodoc: def view_paths self.class.view_paths end - + protected # Renders the content that will be returned to the browser as the response body. # @@ -632,10 +634,6 @@ module ActionController #:nodoc: # # but with a custom layout # render :action => "long_goal", :layout => "spectacular" # - # _Deprecation_ _notice_: This used to have the signatures <tt>render_action("action", status = 200)</tt>, - # <tt>render_without_layout("controller/action", status = 200)</tt>, and - # <tt>render_with_layout("controller/action", status = 200, layout)</tt>. - # # === Rendering partials # # Partial rendering in a controller is most commonly used together with Ajax calls that only update one or a few elements on a page @@ -702,8 +700,6 @@ module ActionController #:nodoc: # # Renders a template relative to the template root and chooses the proper file extension # render :file => "some/template", :use_full_path => true # - # _Deprecation_ _notice_: This used to have the signature <tt>render_file(path, status = 200)</tt> - # # === Rendering text # # Rendering of text is usually used for tests or for rendering prepared content, such as a cache. By default, text @@ -729,8 +725,6 @@ module ActionController #:nodoc: # # Renders "Hello from code!" # render :text => proc { |response, output| output.write("Hello from code!") } # - # _Deprecation_ _notice_: This used to have the signature <tt>render_text("text", status = 200)</tt> - # # === Rendering JSON # # Rendering JSON sets the content type to text/x-json and optionally wraps the JSON in a callback. It is expected @@ -760,8 +754,6 @@ module ActionController #:nodoc: # # Renders "hello david" # render :inline => "<%= 'hello ' + name %>", :locals => { :name => "david" } # - # _Deprecation_ _notice_: This used to have the signature <tt>render_template(template, status = 200, type = :rhtml)</tt> - # # === Rendering inline JavaScriptGenerator page updates # # In addition to rendering JavaScriptGenerator page updates with Ajax in RJS templates (see ActionView::Base for details), @@ -777,25 +769,16 @@ module ActionController #:nodoc: # All renders take the :status and :location options and turn them into headers. They can even be used together: # # render :xml => post.to_xml, :status => :created, :location => post_url(post) - def render(options = nil, deprecated_status = nil, &block) #:doc: + def render(options = nil, &block) #:doc: raise DoubleRenderError, "Can only render or redirect once per action" if performed? if options.nil? - return render_file(default_template_name, deprecated_status, true) + return render_for_file(default_template_name, nil, true) else - # Backwards compatibility - unless options.is_a?(Hash) - if options == :update - options = { :update => true } - else - ActiveSupport::Deprecation.warn( - "You called render('#{options}'), which is a deprecated API call. Instead you use " + - "render :file => #{options}. Calling render with just a string will be removed from Rails 2.0.", - caller - ) - - return render_file(options, deprecated_status, true) - end + if options == :update + options = { :update => true } + elsif !options.is_a?(Hash) + raise RenderError, "You called render with invalid options : #{options}" end end @@ -808,35 +791,45 @@ module ActionController #:nodoc: end if text = options[:text] - render_text(text, options[:status]) + render_for_text(text, options[:status]) else if file = options[:file] - render_file(file, options[:status], options[:use_full_path], options[:locals] || {}) + render_for_file(file, options[:status], options[:use_full_path], options[:locals] || {}) elsif template = options[:template] - render_file(template, options[:status], true) + render_for_file(template, options[:status], true) elsif inline = options[:inline] - render_template(inline, options[:status], options[:type], options[:locals] || {}) + add_variables_to_assigns + render_for_text(@template.render_template(options[:type] || :erb, inline, nil, options[:locals] || {}), options[:status]) elsif action_name = options[:action] - ActiveSupport::Deprecation.silence do - render_action(action_name, options[:status], options[:layout]) - end + 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] - render_xml(xml, options[:status]) + response.content_type = Mime::XML + render_for_text(xml.respond_to?(:to_xml) ? xml.to_xml : xml, options[:status]) elsif json = options[:json] - render_json(json, options[:callback], options[:status]) + 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_partial_collection(partial, collection, options[:spacer_template], options[:locals], options[:status]) + render_for_text(@template.send(:render_partial_collection, partial, collection, options[:spacer_template], options[:locals]), + options[:status]) else - render_partial(partial, ActionView::Base::ObjectWrapper.new(options[:object]), options[:locals], options[:status]) + render_for_text(@template.send(:render_partial, partial, ActionView::Base::ObjectWrapper.new(options[:object]), options[:locals]), + options[:status]) end elsif options[:update] @@ -844,15 +837,15 @@ module ActionController #:nodoc: @template.send :evaluate_assigns generator = ActionView::Helpers::PrototypeHelper::JavaScriptGenerator.new(@template, &block) - render_javascript(generator.to_s) + response.content_type = Mime::JS + render_for_text(generator.to_s) elsif options[:nothing] # Safari doesn't pass the headers of the return if the response is zero length - render_text(" ", options[:status]) + render_for_text(" ", options[:status]) else - render_file(default_template_name, options[:status], true) - + render_for_file(default_template_name, options[:status], true) end end end @@ -860,87 +853,13 @@ module ActionController #:nodoc: # Renders according to the same rules as <tt>render</tt>, but returns the result in a string instead # of sending it as the response body to the browser. def render_to_string(options = nil, &block) #:doc: - ActiveSupport::Deprecation.silence { render(options, &block) } + render(options, &block) ensure erase_render_results forget_variables_added_to_assigns reset_variables_added_to_assigns end - def render_action(action_name, status = nil, with_layout = true) #:nodoc: - template = default_template_name(action_name.to_s) - if with_layout && !template_exempt_from_layout?(template) - render_with_layout(:file => template, :status => status, :use_full_path => true, :layout => true) - else - render_without_layout(:file => template, :status => status, :use_full_path => true) - end - end - - def render_file(template_path, status = nil, use_full_path = false, locals = {}) #:nodoc: - add_variables_to_assigns - assert_existence_of_template_file(template_path) if use_full_path - logger.info("Rendering #{template_path}" + (status ? " (#{status})" : '')) if logger - render_text(@template.render_file(template_path, use_full_path, locals), status) - end - - def render_template(template, status = nil, type = :erb, local_assigns = {}) #:nodoc: - add_variables_to_assigns - render_text(@template.render_template(type, template, nil, local_assigns), status) - end - - def render_text(text = nil, status = nil, append_response = false) #:nodoc: - @performed_render = true - - response.headers['Status'] = interpret_status(status || DEFAULT_RENDER_STATUS_CODE) - - if append_response - response.body ||= '' - response.body << text.to_s - else - response.body = text.is_a?(Proc) ? text : text.to_s - end - end - - def render_javascript(javascript, status = nil, append_response = true) #:nodoc: - response.content_type = Mime::JS - render_text(javascript, status, append_response) - end - - def render_xml(xml, status = nil) #:nodoc: - response.content_type = Mime::XML - render_text(xml.respond_to?(:to_xml) ? xml.to_xml : xml, status) - end - - def render_json(json, callback = nil, status = nil) #:nodoc: - json = "#{callback}(#{json})" unless callback.blank? - - response.content_type = Mime::JSON - render_text(json, status) - end - - def render_nothing(status = nil) #:nodoc: - render_text(' ', status) - end - - def render_partial(partial_path = default_template_name, object = nil, local_assigns = nil, status = nil) #:nodoc: - add_variables_to_assigns - render_text(@template.send(:render_partial, partial_path, object, local_assigns), status) - end - - def render_partial_collection(partial_name, collection, partial_spacer_template = nil, local_assigns = nil, status = nil) #:nodoc: - add_variables_to_assigns - render_text(@template.send(:render_partial_collection, partial_name, collection, partial_spacer_template, local_assigns), status) - end - - def render_with_layout(template_name = default_template_name, status = nil, layout = nil) #:nodoc: - render_with_a_layout(template_name, status, layout) - end - - def render_without_layout(template_name = default_template_name, status = nil) #:nodoc: - render_with_no_layout(template_name, status) - end - - # Return a response that has no content (merely headers). The options # argument is interpreted to be a hash of header names and values. # This allows you to easily return a response that consists only of @@ -1101,6 +1020,27 @@ module ActionController #:nodoc: end private + + def render_for_file(template_path, status = nil, use_full_path = false, locals = {}) #:nodoc: + add_variables_to_assigns + assert_existence_of_template_file(template_path) if use_full_path + logger.info("Rendering #{template_path}" + (status ? " (#{status})" : '')) if logger + render_for_text(@template.render_file(template_path, use_full_path, locals), status) + end + + def render_for_text(text = nil, status = nil, append_response = false) #:nodoc: + @performed_render = true + + response.headers['Status'] = interpret_status(status || DEFAULT_RENDER_STATUS_CODE) + + if append_response + response.body ||= '' + response.body << text.to_s + else + response.body = text.is_a?(Proc) ? text : text.to_s + end + end + def initialize_template_class(response) raise "You must assign a template class through ActionController.template_class= before processing a request" unless @@template_class diff --git a/actionpack/lib/action_controller/benchmarking.rb b/actionpack/lib/action_controller/benchmarking.rb index 8e0d83c2d6..31fa5d940d 100644 --- a/actionpack/lib/action_controller/benchmarking.rb +++ b/actionpack/lib/action_controller/benchmarking.rb @@ -43,12 +43,12 @@ module ActionController #:nodoc: protected def render_with_benchmark(options = nil, deprecated_status = nil, &block) unless logger - render_without_benchmark(options, deprecated_status, &block) + render_without_benchmark(options, &block) else db_runtime = ActiveRecord::Base.connection.reset_runtime if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected? render_output = nil - @rendering_runtime = Benchmark::measure{ render_output = render_without_benchmark(options, deprecated_status, &block) }.real + @rendering_runtime = Benchmark::measure{ render_output = render_without_benchmark(options, &block) }.real if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected? @db_rt_before_render = db_runtime diff --git a/actionpack/lib/action_controller/caching.rb b/actionpack/lib/action_controller/caching.rb index 043b4ea761..3434f5f9da 100644 --- a/actionpack/lib/action_controller/caching.rb +++ b/actionpack/lib/action_controller/caching.rb @@ -232,7 +232,7 @@ module ActionController #:nodoc: if cache = controller.read_fragment(cache_path.path) controller.rendered_action_cache = true set_content_type!(controller, cache_path.extension) - controller.send(:render_text, cache) + controller.send(:render_for_text, cache) false else controller.action_cache_path = cache_path diff --git a/actionpack/lib/action_controller/components.rb b/actionpack/lib/action_controller/components.rb index 93008ce444..dc3032219b 100644 --- a/actionpack/lib/action_controller/components.rb +++ b/actionpack/lib/action_controller/components.rb @@ -78,7 +78,7 @@ module ActionController #:nodoc: # Renders the component specified as the response for the current method def render_component(options) #:doc: component_logging(options) do - render_text(component_response(options, true).body, response.headers["Status"]) + render_for_text(component_response(options, true).body, response.headers["Status"]) end end diff --git a/actionpack/lib/action_controller/layout.rb b/actionpack/lib/action_controller/layout.rb index 027ae42aeb..ff4a4057a2 100644 --- a/actionpack/lib/action_controller/layout.rb +++ b/actionpack/lib/action_controller/layout.rb @@ -233,29 +233,23 @@ module ActionController #:nodoc: end protected - def render_with_a_layout(options = nil, deprecated_status = nil, deprecated_layout = nil, &block) #:nodoc: + def render_with_a_layout(options = nil, &block) #:nodoc: template_with_options = options.is_a?(Hash) - if apply_layout?(template_with_options, options) && (layout = pick_layout(template_with_options, options, deprecated_layout)) + if apply_layout?(template_with_options, options) && (layout = pick_layout(template_with_options, options)) assert_existence_of_template_file(layout) options = options.merge :layout => false if template_with_options logger.info("Rendering template within #{layout}") if logger - if template_with_options - content_for_layout = render_with_no_layout(options, &block) - deprecated_status = options[:status] || deprecated_status - else - content_for_layout = render_with_no_layout(options, deprecated_status, &block) - end - + content_for_layout = render_with_no_layout(options, &block) erase_render_results add_variables_to_assigns @template.instance_variable_set("@content_for_layout", content_for_layout) response.layout = layout - render_text(@template.render_file(layout, true), deprecated_status) + render_for_text(@template.render_file(layout, true)) else - render_with_no_layout(options, deprecated_status, &block) + render_with_no_layout(options, &block) end end @@ -272,10 +266,8 @@ module ActionController #:nodoc: !template_exempt_from_layout?(default_template_name(options[:action] || options[:template])) end - def pick_layout(template_with_options, options, deprecated_layout) - if deprecated_layout - deprecated_layout - elsif template_with_options + def pick_layout(template_with_options, options) + if template_with_options case layout = options[:layout] when FalseClass nil diff --git a/actionpack/lib/action_controller/rescue.rb b/actionpack/lib/action_controller/rescue.rb index 3ab10107bf..8eb6379fcf 100644 --- a/actionpack/lib/action_controller/rescue.rb +++ b/actionpack/lib/action_controller/rescue.rb @@ -125,7 +125,7 @@ module ActionController #:nodoc: @template.instance_variable_set("@contents", @template.render_file(template_path_for_local_rescue(exception), false)) response.content_type = Mime::HTML - render_file(rescues_path("layout"), response_code_for_rescue(exception)) + render_for_file(rescues_path("layout"), response_code_for_rescue(exception)) end private diff --git a/actionpack/lib/action_view/partials.rb b/actionpack/lib/action_view/partials.rb index e26ca499d0..8fb4c3a727 100644 --- a/actionpack/lib/action_view/partials.rb +++ b/actionpack/lib/action_view/partials.rb @@ -103,13 +103,11 @@ module ActionView # As you can see, the :locals hash is shared between both the partial and its layout. module Partials private - # Deprecated, use render :partial - def render_partial(partial_path, local_assigns = nil, deprecated_local_assigns = nil) #:nodoc: + def render_partial(partial_path, object_assigns = nil, local_assigns = nil) #:nodoc: case partial_path when String, Symbol, NilClass path, partial_name = partial_pieces(partial_path) - object = extracting_object(partial_name, local_assigns, deprecated_local_assigns) - local_assigns = extract_local_assigns(local_assigns, deprecated_local_assigns) + object = extracting_object(partial_name, object_assigns) local_assigns = local_assigns ? local_assigns.clone : {} add_counter_to_local_assigns!(partial_name, local_assigns) add_object_to_local_assigns!(partial_name, local_assigns, object) @@ -125,18 +123,17 @@ module ActionView if partial_path.any? path = ActionController::RecordIdentifier.partial_path(partial_path.first) collection = partial_path - render_partial_collection(path, collection, nil, local_assigns.value) + render_partial_collection(path, collection, nil, object_assigns.value) else "" end else render_partial( ActionController::RecordIdentifier.partial_path(partial_path), - local_assigns, deprecated_local_assigns) + object_assigns, local_assigns) end end - # Deprecated, use render :partial, :collection def render_partial_collection(partial_name, collection, partial_spacer_template = nil, local_assigns = nil) #:nodoc: collection_of_partials = Array.new counter_name = partial_counter_name(partial_name) @@ -174,20 +171,15 @@ module ActionView partial_name.split('/').last.split('.').first.intern end - def extracting_object(partial_name, local_assigns, deprecated_local_assigns) + def extracting_object(partial_name, object_assigns) variable_name = partial_variable_name(partial_name) - if local_assigns.is_a?(Hash) || local_assigns.nil? + if object_assigns.nil? controller.instance_variable_get("@#{variable_name}") else - # deprecated form where object could be passed in as second parameter - local_assigns + object_assigns end end - def extract_local_assigns(local_assigns, deprecated_local_assigns) - local_assigns.is_a?(Hash) ? local_assigns : deprecated_local_assigns - end - def add_counter_to_local_assigns!(partial_name, local_assigns) counter_name = partial_counter_name(partial_name) local_assigns[counter_name] = 1 unless local_assigns.has_key?(counter_name) |