aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/new_base
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_controller/new_base')
-rw-r--r--actionpack/lib/action_controller/new_base/base.rb23
-rw-r--r--actionpack/lib/action_controller/new_base/compatibility.rb62
-rw-r--r--actionpack/lib/action_controller/new_base/conditional_get.rb32
-rw-r--r--actionpack/lib/action_controller/new_base/helpers.rb53
-rw-r--r--actionpack/lib/action_controller/new_base/hide_actions.rb48
-rw-r--r--actionpack/lib/action_controller/new_base/http.rb80
-rw-r--r--actionpack/lib/action_controller/new_base/layouts.rb44
-rw-r--r--actionpack/lib/action_controller/new_base/rack_convenience.rb33
-rw-r--r--actionpack/lib/action_controller/new_base/redirector.rb8
-rw-r--r--actionpack/lib/action_controller/new_base/render_options.rb58
-rw-r--r--actionpack/lib/action_controller/new_base/renderer.rb96
-rw-r--r--actionpack/lib/action_controller/new_base/rescuable.rb31
-rw-r--r--actionpack/lib/action_controller/new_base/session.rb4
-rw-r--r--actionpack/lib/action_controller/new_base/testing.rb7
-rw-r--r--actionpack/lib/action_controller/new_base/url_for.rb10
15 files changed, 334 insertions, 255 deletions
diff --git a/actionpack/lib/action_controller/new_base/base.rb b/actionpack/lib/action_controller/new_base/base.rb
index ffe608ade4..d7b65d37fa 100644
--- a/actionpack/lib/action_controller/new_base/base.rb
+++ b/actionpack/lib/action_controller/new_base/base.rb
@@ -1,7 +1,7 @@
module ActionController
class Base < Http
abstract!
-
+
include AbstractController::Benchmarker
include AbstractController::Callbacks
include AbstractController::Logger
@@ -14,6 +14,7 @@ module ActionController
include ActionController::Renderers::All
include ActionController::Layouts
include ActionController::ConditionalGet
+ include ActionController::RackConvenience
# Legacy modules
include SessionManagement
@@ -38,9 +39,9 @@ module ActionController
# TODO: Extract into its own module
# This should be moved together with other normalizing behavior
module ImplicitRender
- def process_action(method_name)
+ def send_action(method_name)
ret = super
- default_render if response_body.nil?
+ default_render unless performed?
ret
end
@@ -65,31 +66,31 @@ module ActionController
::ActionController::Base.subclasses << klass.to_s
super
end
-
+
def self.subclasses
@subclasses ||= []
end
-
+
def self.app_loaded!
@subclasses.each do |subclass|
subclass.constantize._write_layout_method
end
end
-
+
def _normalize_options(action = nil, options = {}, &blk)
if action.is_a?(Hash)
- options, action = action, nil
+ options, action = action, nil
elsif action.is_a?(String) || action.is_a?(Symbol)
key = case action = action.to_s
when %r{^/} then :file
when %r{/} then :template
else :action
- end
+ end
options.merge! key => action
elsif action
options.merge! :partial => action
end
-
+
if options.key?(:action) && options[:action].to_s.index("/")
options[:template] = options.delete(:action)
end
@@ -139,7 +140,7 @@ module ActionController
#
# When using <tt>redirect_to :back</tt>, if there is no referrer,
# RedirectBackError will be raised. You may specify some fallback
- # behavior for this case by rescuing RedirectBackError.
+ # behavior for this case by rescuing RedirectBackError.
def redirect_to(options = {}, response_status = {}) #:doc:
raise ActionControllerError.new("Cannot redirect to nil!") if options.nil?
@@ -165,7 +166,7 @@ module ActionController
else
url_for(options)
end
-
+
super(url, status)
end
end
diff --git a/actionpack/lib/action_controller/new_base/compatibility.rb b/actionpack/lib/action_controller/new_base/compatibility.rb
index 4245ba982b..f278c2da14 100644
--- a/actionpack/lib/action_controller/new_base/compatibility.rb
+++ b/actionpack/lib/action_controller/new_base/compatibility.rb
@@ -1,6 +1,6 @@
module ActionController
module Rails2Compatibility
- extend ActiveSupport::DependencyModule
+ extend ActiveSupport::Concern
class ::ActionController::ActionControllerError < StandardError #:nodoc:
end
@@ -9,43 +9,43 @@ module ActionController
included do
::ActionController::UnknownAction = ::AbstractController::ActionNotFound
::ActionController::DoubleRenderError = ::AbstractController::DoubleRenderError
-
+
cattr_accessor :session_options
self.session_options = {}
-
+
cattr_accessor :allow_concurrency
self.allow_concurrency = false
-
+
cattr_accessor :param_parsers
self.param_parsers = { Mime::MULTIPART_FORM => :multipart_form,
Mime::URL_ENCODED_FORM => :url_encoded_form,
Mime::XML => :xml_simple,
Mime::JSON => :json }
-
+
cattr_accessor :relative_url_root
self.relative_url_root = ENV['RAILS_RELATIVE_URL_ROOT']
-
+
cattr_accessor :default_charset
self.default_charset = "utf-8"
-
+
# cattr_reader :protected_instance_variables
cattr_accessor :protected_instance_variables
self.protected_instance_variables = %w(@assigns @performed_redirect @performed_render @variables_added @request_origin @url @parent_controller
@action_name @before_filter_chain_aborted @action_cache_path @_headers @_params
@_flash @_response)
-
+
# Indicates whether or not optimise the generated named
# route helper methods
cattr_accessor :optimise_named_routes
self.optimise_named_routes = true
-
+
cattr_accessor :resources_path_names
self.resources_path_names = { :new => 'new', :edit => 'edit' }
-
+
# Controls the resource action separator
cattr_accessor :resource_action_separator
self.resource_action_separator = "/"
-
+
cattr_accessor :use_accept_header
self.use_accept_header = true
@@ -61,19 +61,29 @@ module ActionController
# and images to a dedicated asset server away from the main web server. Example:
# ActionController::Base.asset_host = "http://assets.example.com"
cattr_accessor :asset_host
+
+ cattr_accessor :ip_spoofing_check
+ self.ip_spoofing_check = true
end
-
+
# For old tests
def initialize_template_class(*) end
def assign_shortcuts(*) end
# TODO: Remove this after we flip
def template
- _action_view
+ @template ||= _action_view
+ end
+
+ def process_action(*)
+ template
+ super
end
module ClassMethods
- def consider_all_requests_local() end
+ def consider_all_requests_local
+ end
+
def rescue_action(env)
raise env["action_dispatch.rescue.exception"]
end
@@ -84,16 +94,11 @@ module ActionController
end
end
- def initialize(*)
- super
- @template = _action_view
- end
-
def render_to_body(options)
if options.is_a?(Hash) && options.key?(:template)
options[:template].sub!(/^\//, '')
end
-
+
options[:text] = nil if options[:nothing] == true
body = super
@@ -107,8 +112,8 @@ module ActionController
def method_for_action(action_name)
super || (respond_to?(:method_missing) && "_handle_method_missing")
- end
-
+ end
+
def _layout_prefix(name)
super unless name =~ /\blayouts/
end
@@ -116,5 +121,18 @@ module ActionController
def performed?
response_body
end
+
+ # ==== Request only view path switching ====
+ def append_view_path(path)
+ view_paths.push(*path)
+ end
+
+ def prepend_view_path(path)
+ view_paths.unshift(*path)
+ end
+
+ def view_paths
+ _action_view.view_paths
+ end
end
end
diff --git a/actionpack/lib/action_controller/new_base/conditional_get.rb b/actionpack/lib/action_controller/new_base/conditional_get.rb
index 116ce34494..d287ec4994 100644
--- a/actionpack/lib/action_controller/new_base/conditional_get.rb
+++ b/actionpack/lib/action_controller/new_base/conditional_get.rb
@@ -1,12 +1,15 @@
module ActionController
module ConditionalGet
-
+ extend ActiveSupport::Concern
+
+ include RackConvenience
+
# Sets the etag, last_modified, or both on the response and renders a
# "304 Not Modified" response if the request is already fresh.
#
# Parameters:
# * <tt>:etag</tt>
- # * <tt>:last_modified</tt>
+ # * <tt>:last_modified</tt>
# * <tt>:public</tt> By default the Cache-Control header is private, set this to true if you want your application to be cachable by other devices (proxy caches).
#
# Example:
@@ -18,14 +21,14 @@ module ActionController
#
# This will render the show template if the request isn't sending a matching etag or
# If-Modified-Since header and just a "304 Not Modified" response if there's a match.
- #
+ #
def fresh_when(options)
options.assert_valid_keys(:etag, :last_modified, :public)
response.etag = options[:etag] if options[:etag]
response.last_modified = options[:last_modified] if options[:last_modified]
-
- if options[:public]
+
+ if options[:public]
cache_control = response.headers["Cache-Control"].split(",").map {|k| k.strip }
cache_control.delete("private")
cache_control.delete("no-cache")
@@ -36,8 +39,8 @@ module ActionController
if request.fresh?(response)
head :not_modified
end
- end
-
+ 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
@@ -64,8 +67,8 @@ module ActionController
end
render :nothing => true, :status => status
- end
-
+ end
+
# Sets the etag and/or last_modified on the response and checks it against
# the client request. If the request doesn't match the options provided, the
# request is considered stale and should be generated from scratch. Otherwise,
@@ -73,7 +76,7 @@ module ActionController
#
# Parameters:
# * <tt>:etag</tt>
- # * <tt>:last_modified</tt>
+ # * <tt>:last_modified</tt>
# * <tt>:public</tt> By default the Cache-Control header is private, set this to true if you want your application to be cachable by other devices (proxy caches).
#
# Example:
@@ -92,7 +95,7 @@ module ActionController
fresh_when(options)
!request.fresh?(response)
end
-
+
# Sets a HTTP 1.1 Cache-Control header. Defaults to issuing a "private" instruction, so that
# intermediate caches shouldn't cache the response.
#
@@ -114,10 +117,10 @@ module ActionController
else
cache_control << "private"
end
-
+
# This allows for additional headers to be passed through like 'max-stale' => 5.hours
cache_control += options.symbolize_keys.reject{|k,v| k == :public || k == :private }.map{ |k,v| v == true ? k.to_s : "#{k.to_s}=#{v.to_s}"}
-
+
response.headers["Cache-Control"] = cache_control.join(', ')
end
@@ -126,6 +129,5 @@ module ActionController
def expires_now #:doc:
response.headers["Cache-Control"] = "no-cache"
end
-
end
-end \ No newline at end of file
+end
diff --git a/actionpack/lib/action_controller/new_base/helpers.rb b/actionpack/lib/action_controller/new_base/helpers.rb
index e00c3c338b..e8000be87b 100644
--- a/actionpack/lib/action_controller/new_base/helpers.rb
+++ b/actionpack/lib/action_controller/new_base/helpers.rb
@@ -4,9 +4,9 @@ require 'active_support/dependencies'
module ActionController
module Helpers
- extend ActiveSupport::DependencyModule
+ extend ActiveSupport::Concern
- depends_on AbstractController::Helpers
+ include AbstractController::Helpers
included do
# Set the default directory for helpers
@@ -24,10 +24,10 @@ module ActionController
#
# * <tt>*args</tt>: One or more modules, strings or symbols, or the special symbol <tt>:all</tt>.
# * <tt>&block</tt>: A block defining helper methods.
- #
+ #
# ==== Examples
- # When the argument is a string or symbol, the method will provide the "_helper" suffix, require the file
- # and include the module in the template class. The second form illustrates how to include custom helpers
+ # When the argument is a string or symbol, the method will provide the "_helper" suffix, require the file
+ # and include the module in the template class. The second form illustrates how to include custom helpers
# when working with namespaced controllers, or other cases where the file containing the helper definition is not
# in one of Rails' standard load paths:
# helper :foo # => requires 'foo_helper' and includes FooHelper
@@ -40,17 +40,17 @@ module ActionController
# <tt>ActionController::Base.helpers_dir</tt> (defaults to <tt>app/helpers/**/*.rb</tt> under RAILS_ROOT).
# helper :all
#
- # Additionally, the +helper+ class method can receive and evaluate a block, making the methods defined available
+ # Additionally, the +helper+ class method can receive and evaluate a block, making the methods defined available
# to the template.
# # One line
# helper { def hello() "Hello, world!" end }
# # Multi-line
# helper do
- # def foo(bar)
- # "#{bar} is the very best"
+ # def foo(bar)
+ # "#{bar} is the very best"
# end
# end
- #
+ #
# Finally, all the above styles can be mixed together, and the +helper+ method can be invoked with a mix of
# +symbols+, +strings+, +modules+ and blocks.
# helper(:three, BlindHelper) { def mice() 'mice' end }
@@ -106,25 +106,24 @@ module ActionController
end
private
-
- def default_helper_module!
- unless name.blank?
- module_name = name.sub(/Controller$|$/, 'Helper')
- module_path = module_name.split('::').map { |m| m.underscore }.join('/')
- require_dependency module_path
- helper module_name.constantize
+ def default_helper_module!
+ unless name.blank?
+ module_name = name.sub(/Controller$|$/, 'Helper')
+ module_path = module_name.split('::').map { |m| m.underscore }.join('/')
+ require_dependency module_path
+ helper module_name.constantize
+ end
+ rescue MissingSourceFile => e
+ raise unless e.is_missing? module_path
+ rescue NameError => e
+ raise unless e.missing_name? module_name
end
- rescue MissingSourceFile => e
- raise unless e.is_missing? module_path
- rescue NameError => e
- raise unless e.missing_name? module_name
- end
- # Extract helper names from files in app/helpers/**/*.rb
- def all_application_helpers
- extract = /^#{Regexp.quote(helpers_dir)}\/?(.*)_helper.rb$/
- Dir["#{helpers_dir}/**/*_helper.rb"].map { |file| file.sub extract, '\1' }
- end
- end # ClassMethods
+ # Extract helper names from files in app/helpers/**/*.rb
+ def all_application_helpers
+ extract = /^#{Regexp.quote(helpers_dir)}\/?(.*)_helper.rb$/
+ Dir["#{helpers_dir}/**/*_helper.rb"].map { |file| file.sub extract, '\1' }
+ end
+ end
end
end
diff --git a/actionpack/lib/action_controller/new_base/hide_actions.rb b/actionpack/lib/action_controller/new_base/hide_actions.rb
index a29b09a893..b45e520bee 100644
--- a/actionpack/lib/action_controller/new_base/hide_actions.rb
+++ b/actionpack/lib/action_controller/new_base/hide_actions.rb
@@ -1,33 +1,39 @@
module ActionController
module HideActions
- extend ActiveSupport::DependencyModule
+ extend ActiveSupport::Concern
included do
extlib_inheritable_accessor :hidden_actions
self.hidden_actions ||= Set.new
end
- def action_methods() self.class.action_names end
- def action_names() action_methods end
-
- private
-
- def action_method?(action_name)
- !hidden_actions.include?(action_name) && super
+ def action_methods
+ self.class.action_names
end
-
- module ClassMethods
- def hide_action(*args)
- args.each do |arg|
- self.hidden_actions << arg.to_s
- end
- end
-
- def action_methods
- @action_names ||= Set.new(super.reject {|name| self.hidden_actions.include?(name.to_s)})
- end
- def self.action_names() action_methods end
+ def action_names
+ action_methods
end
+
+ private
+ def action_method?(action_name)
+ !hidden_actions.include?(action_name) && super
+ end
+
+ module ClassMethods
+ def hide_action(*args)
+ args.each do |arg|
+ self.hidden_actions << arg.to_s
+ end
+ end
+
+ def action_methods
+ @action_names ||= Set.new(super.reject {|name| self.hidden_actions.include?(name.to_s)})
+ end
+
+ def self.action_names
+ action_methods
+ end
+ end
end
-end \ No newline at end of file
+end
diff --git a/actionpack/lib/action_controller/new_base/http.rb b/actionpack/lib/action_controller/new_base/http.rb
index 2525e221a6..c96aaaa865 100644
--- a/actionpack/lib/action_controller/new_base/http.rb
+++ b/actionpack/lib/action_controller/new_base/http.rb
@@ -4,9 +4,9 @@ require 'active_support/core_ext/module/delegation'
module ActionController
class Http < AbstractController::Base
abstract!
-
+
# :api: public
- attr_internal :request, :response, :params
+ attr_internal :params, :env
# :api: public
def self.controller_name
@@ -14,54 +14,78 @@ module ActionController
end
# :api: public
- def controller_name() self.class.controller_name end
+ def controller_name
+ self.class.controller_name
+ end
- # :api: public
+ # :api: public
def self.controller_path
@controller_path ||= self.name.sub(/Controller$/, '').underscore
end
-
- # :api: public
- def controller_path() self.class.controller_path end
-
- # :api: private
- def self.action_names() action_methods end
-
+
+ # :api: public
+ def controller_path
+ self.class.controller_path
+ end
+
+ # :api: private
+ def self.action_names
+ action_methods
+ end
+
# :api: private
- def action_names() action_methods end
-
+ def action_names
+ action_methods
+ end
+
# :api: plugin
def self.call(env)
controller = new
controller.call(env).to_rack
end
-
- delegate :headers, :to => "@_response"
- def params
- @_params ||= @_request.parameters
+ # The details below can be overridden to support a specific
+ # Request and Response object. The default ActionController::Base
+ # implementation includes RackConvenience, which makes a request
+ # and response object available. You might wish to control the
+ # environment and response manually for performance reasons.
+
+ attr_internal :status, :headers, :content_type
+
+ def initialize(*)
+ @_headers = {}
+ super
+ end
+
+ # Basic implements for content_type=, location=, and headers are
+ # provided to reduce the dependency on the RackConvenience module
+ # in Renderer and Redirector.
+
+ def content_type=(type)
+ headers["Content-Type"] = type.to_s
end
-
+
+ def location=(url)
+ headers["Location"] = url
+ end
+
# :api: private
def call(name, env)
- @_request = ActionDispatch::Request.new(env)
- @_response = ActionDispatch::Response.new
- @_response.request = request
+ @_env = env
process(name)
to_rack
end
-
+
+ # :api: private
+ def to_rack
+ [status, headers, response_body]
+ end
+
def self.action(name)
@actions ||= {}
@actions[name.to_s] ||= proc do |env|
new.call(name, env)
end
end
-
- # :api: private
- def to_rack
- @_response.prepare!
- @_response.to_a
- end
end
end
diff --git a/actionpack/lib/action_controller/new_base/layouts.rb b/actionpack/lib/action_controller/new_base/layouts.rb
index 35068db770..0ff71587d6 100644
--- a/actionpack/lib/action_controller/new_base/layouts.rb
+++ b/actionpack/lib/action_controller/new_base/layouts.rb
@@ -1,36 +1,34 @@
module ActionController
module Layouts
- extend ActiveSupport::DependencyModule
+ extend ActiveSupport::Concern
+
+ include ActionController::Renderer
+ include AbstractController::Layouts
- depends_on ActionController::Renderer
- depends_on AbstractController::Layouts
-
module ClassMethods
def _implied_layout_name
controller_path
end
end
-
- private
- def _determine_template(options)
- super
- if (!options.key?(:text) && !options.key?(:inline) && !options.key?(:partial)) || options.key?(:layout)
- options[:_layout] = _layout_for_option(options.key?(:layout) ? options[:layout] : :none, options[:_template].details)
+ private
+ def _determine_template(options)
+ super
+ if (!options.key?(:text) && !options.key?(:inline) && !options.key?(:partial)) || options.key?(:layout)
+ options[:_layout] = _layout_for_option(options.key?(:layout) ? options[:layout] : :none, options[:_template].details)
+ end
end
- end
-
- def _layout_for_option(name, details)
- case name
- when String then _layout_for_name(name, details)
- when true then _default_layout(true, details)
- when :none then _default_layout(false, details)
- when false, nil then nil
- else
- raise ArgumentError,
- "String, true, or false, expected for `layout'; you passed #{name.inspect}"
+
+ def _layout_for_option(name, details)
+ case name
+ when String then _layout_for_name(name, details)
+ when true then _default_layout(true, details)
+ when :none then _default_layout(false, details)
+ when false, nil then nil
+ else
+ raise ArgumentError,
+ "String, true, or false, expected for `layout'; you passed #{name.inspect}"
+ end
end
- end
-
end
end
diff --git a/actionpack/lib/action_controller/new_base/rack_convenience.rb b/actionpack/lib/action_controller/new_base/rack_convenience.rb
new file mode 100644
index 0000000000..5dfa7d12f3
--- /dev/null
+++ b/actionpack/lib/action_controller/new_base/rack_convenience.rb
@@ -0,0 +1,33 @@
+module ActionController
+ module RackConvenience
+ extend ActiveSupport::Concern
+
+ included do
+ delegate :headers, :status=, :location=,
+ :status, :location, :content_type, :to => "@_response"
+ attr_internal :request, :response
+ end
+
+ def call(name, env)
+ @_request = ActionDispatch::Request.new(env)
+ @_response = ActionDispatch::Response.new
+ @_response.request = request
+ super
+ end
+
+ def params
+ @_params ||= @_request.parameters
+ end
+
+ # :api: private
+ def to_rack
+ @_response.prepare!
+ @_response.to_a
+ end
+
+ def response_body=(body)
+ response.body = body if response
+ super
+ end
+ end
+end
diff --git a/actionpack/lib/action_controller/new_base/redirector.rb b/actionpack/lib/action_controller/new_base/redirector.rb
index ff7b74341c..20060b001f 100644
--- a/actionpack/lib/action_controller/new_base/redirector.rb
+++ b/actionpack/lib/action_controller/new_base/redirector.rb
@@ -6,14 +6,14 @@ module ActionController
super(message || DEFAULT_MESSAGE)
end
end
-
+
module Redirector
def redirect_to(url, status) #:doc:
raise AbstractController::DoubleRenderError if response_body
logger.info("Redirected to #{url}") if logger && logger.info?
- response.status = status
- response.location = url.gsub(/[\r\n]/, '')
+ self.status = status
+ self.location = url.gsub(/[\r\n]/, '')
self.response_body = "<html><body>You are being <a href=\"#{CGI.escapeHTML(url)}\">redirected</a>.</body></html>"
end
end
-end \ No newline at end of file
+end
diff --git a/actionpack/lib/action_controller/new_base/render_options.rb b/actionpack/lib/action_controller/new_base/render_options.rb
index 581a92cb7b..fc9a02626f 100644
--- a/actionpack/lib/action_controller/new_base/render_options.rb
+++ b/actionpack/lib/action_controller/new_base/render_options.rb
@@ -1,12 +1,12 @@
module ActionController
module RenderOptions
- extend ActiveSupport::DependencyModule
-
+ extend ActiveSupport::Concern
+
included do
extlib_inheritable_accessor :_renderers
self._renderers = []
end
-
+
module ClassMethods
def _write_render_options
renderers = _renderers.map do |r|
@@ -17,33 +17,31 @@ module ActionController
end
RUBY_EVAL
end
-
+
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
def _handle_render_options(options)
#{renderers.join}
end
RUBY_EVAL
end
-
+
def _add_render_option(name)
_renderers << name
_write_render_options
end
end
-
+
def render_to_body(options)
_handle_render_options(options) || super
end
end
-
- module RenderOption
- extend ActiveSupport::DependencyModule
- included do
- extend ActiveSupport::DependencyModule
- depends_on ::ActionController::RenderOptions
+ module RenderOption #:nodoc:
+ def self.extended(base)
+ base.extend ActiveSupport::Concern
+ base.send :include, ::ActionController::RenderOptions
- def self.register_renderer(name)
+ def base.register_renderer(name)
included { _add_render_option(name) }
end
end
@@ -51,57 +49,55 @@ module ActionController
module Renderers
module Json
- include RenderOption
+ extend RenderOption
register_renderer :json
-
+
def _render_json(json, options)
json = ActiveSupport::JSON.encode(json) unless json.respond_to?(:to_str)
json = "#{options[:callback]}(#{json})" unless options[:callback].blank?
- response.content_type ||= Mime::JSON
+ self.content_type ||= Mime::JSON
self.response_body = json
- end
+ end
end
module Js
- include RenderOption
+ extend RenderOption
register_renderer :js
def _render_js(js, options)
- response.content_type ||= Mime::JS
+ self.content_type ||= Mime::JS
self.response_body = js
end
end
module Xml
- include RenderOption
+ extend RenderOption
register_renderer :xml
def _render_xml(xml, options)
- response.content_type ||= Mime::XML
+ self.content_type ||= Mime::XML
self.response_body = xml.respond_to?(:to_xml) ? xml.to_xml : xml
end
end
- module Rjs
- include RenderOption
+ module RJS
+ extend RenderOption
register_renderer :update
def _render_update(proc, options)
generator = ActionView::Helpers::PrototypeHelper::JavaScriptGenerator.new(_action_view, &proc)
- response.content_type = Mime::JS
+ self.content_type = Mime::JS
self.response_body = generator.to_s
end
end
module All
- extend ActiveSupport::DependencyModule
+ extend ActiveSupport::Concern
- included do
- include ::ActionController::Renderers::Json
- include ::ActionController::Renderers::Js
- include ::ActionController::Renderers::Xml
- include ::ActionController::Renderers::Rjs
- end
+ include ActionController::Renderers::Json
+ include ActionController::Renderers::Js
+ include ActionController::Renderers::Xml
+ include ActionController::Renderers::RJS
end
end
end
diff --git a/actionpack/lib/action_controller/new_base/renderer.rb b/actionpack/lib/action_controller/new_base/renderer.rb
index 987751a601..2fab501302 100644
--- a/actionpack/lib/action_controller/new_base/renderer.rb
+++ b/actionpack/lib/action_controller/new_base/renderer.rb
@@ -1,23 +1,18 @@
module ActionController
module Renderer
- extend ActiveSupport::DependencyModule
+ extend ActiveSupport::Concern
+
+ include AbstractController::Renderer
- depends_on AbstractController::Renderer
-
def process_action(*)
self.formats = request.formats.map {|x| x.to_sym}
super
end
-
- def response_body=(body)
- response.body = body if response
- super
- end
def render(options)
super
options[:_template] ||= _action_view._partial
- response.content_type ||= begin
+ self.content_type ||= begin
mime = options[:_template].mime_type
formats.include?(mime && mime.to_sym) || formats.include?(:all) ? mime : Mime::Type.lookup_by_extension(formats.first)
end
@@ -26,7 +21,7 @@ module ActionController
def render_to_body(options)
_process_options(options)
-
+
if options.key?(:partial)
_render_partial(options[:partial], options)
end
@@ -34,51 +29,50 @@ module ActionController
super
end
- private
+ private
+ def _prefix
+ controller_path
+ end
- def _prefix
- controller_path
- end
+ def _determine_template(options)
+ if options.key?(:text)
+ options[:_template] = ActionView::TextTemplate.new(options[:text], formats.first)
+ elsif options.key?(:inline)
+ handler = ActionView::Template.handler_class_for_extension(options[:type] || "erb")
+ template = ActionView::Template.new(options[:inline], "inline #{options[:inline].inspect}", handler, {})
+ options[:_template] = template
+ elsif options.key?(:template)
+ options[:_template_name] = options[:template]
+ elsif options.key?(:file)
+ options[:_template_name] = options[:file]
+ elsif !options.key?(:partial)
+ options[:_template_name] = (options[:action] || action_name).to_s
+ options[:_prefix] = _prefix
+ end
- def _determine_template(options)
- if options.key?(:text)
- options[:_template] = ActionView::TextTemplate.new(options[:text], formats.first)
- elsif options.key?(:inline)
- handler = ActionView::Template.handler_class_for_extension(options[:type] || "erb")
- template = ActionView::Template.new(options[:inline], "inline #{options[:inline].inspect}", handler, {})
- options[:_template] = template
- elsif options.key?(:template)
- options[:_template_name] = options[:template]
- elsif options.key?(:file)
- options[:_template_name] = options[:file]
- elsif !options.key?(:partial)
- options[:_template_name] = (options[:action] || action_name).to_s
- options[:_prefix] = _prefix
+ super
end
-
- super
- end
- def _render_partial(partial, options)
- case partial
- when true
- options[:_prefix] = _prefix
- when String
- options[:_prefix] = _prefix unless partial.index('/')
- options[:_template_name] = partial
- else
- options[:_partial_object] = true
- return
+ def _render_partial(partial, options)
+ case partial
+ when true
+ options[:_prefix] = _prefix
+ when String
+ options[:_prefix] = _prefix unless partial.index('/')
+ options[:_template_name] = partial
+ else
+ options[:_partial_object] = true
+ return
+ end
+
+ options[:_partial] = options[:object] || true
+ end
+
+ def _process_options(options)
+ status, content_type, location = options.values_at(:status, :content_type, :location)
+ self.status = status if status
+ self.content_type = content_type if content_type
+ self.headers["Location"] = url_for(location) if location
end
-
- options[:_partial] = options[:object] || true
- end
-
- def _process_options(options)
- status, content_type, location = options.values_at(:status, :content_type, :location)
- response.status = status if status
- response.content_type = content_type if content_type
- response.headers["Location"] = url_for(location) if location
- end
end
end
diff --git a/actionpack/lib/action_controller/new_base/rescuable.rb b/actionpack/lib/action_controller/new_base/rescuable.rb
index 29ffe19d5f..029e643d93 100644
--- a/actionpack/lib/action_controller/new_base/rescuable.rb
+++ b/actionpack/lib/action_controller/new_base/rescuable.rb
@@ -15,7 +15,7 @@ module ActionController #:nodoc:
# behavior is achieved by overriding the <tt>rescue_action_in_public</tt>
# and <tt>rescue_action_locally</tt> methods.
module Rescue
- extend ActiveSupport::DependencyModule
+ extend ActiveSupport::Concern
included do
include ActiveSupport::Rescuable
@@ -32,22 +32,21 @@ module ActionController #:nodoc:
attr_internal :rescued_exception
- private
-
- def method_for_action(action_name)
- return action_name if self.rescued_exception = request.env.delete("action_dispatch.rescue.exception")
- super
- end
+ private
+ def method_for_action(action_name)
+ return action_name if self.rescued_exception = request.env.delete("action_dispatch.rescue.exception")
+ super
+ end
- def _rescue_action
- rescue_with_handler(rescued_exception) || raise(rescued_exception)
- end
+ def _rescue_action
+ rescue_with_handler(rescued_exception) || raise(rescued_exception)
+ end
- def process_action(*)
- super
- rescue Exception => exception
- self.rescued_exception = exception
- _rescue_action
- end
+ def process_action(*)
+ super
+ rescue Exception => exception
+ self.rescued_exception = exception
+ _rescue_action
+ end
end
end
diff --git a/actionpack/lib/action_controller/new_base/session.rb b/actionpack/lib/action_controller/new_base/session.rb
index a8715555fb..bcedd6e1c7 100644
--- a/actionpack/lib/action_controller/new_base/session.rb
+++ b/actionpack/lib/action_controller/new_base/session.rb
@@ -1,5 +1,9 @@
module ActionController
module Session
+ extend ActiveSupport::Concern
+
+ include RackConvenience
+
def session
@_request.session
end
diff --git a/actionpack/lib/action_controller/new_base/testing.rb b/actionpack/lib/action_controller/new_base/testing.rb
index 78051a6252..a4a1116d9e 100644
--- a/actionpack/lib/action_controller/new_base/testing.rb
+++ b/actionpack/lib/action_controller/new_base/testing.rb
@@ -1,6 +1,8 @@
module ActionController
module Testing
- extend ActiveSupport::DependencyModule
+ extend ActiveSupport::Concern
+
+ include RackConvenience
# OMG MEGA HAX
def process_with_new_base_test(request, response)
@@ -13,7 +15,7 @@ module ActionController
set_test_assigns
ret
end
-
+
def set_test_assigns
@assigns = {}
(instance_variable_names - self.class.protected_instance_variables).each do |var|
@@ -33,6 +35,5 @@ module ActionController
_process_action_callbacks.find_all{|x| x.kind == :before}.map{|x| x.name}
end
end
-
end
end
diff --git a/actionpack/lib/action_controller/new_base/url_for.rb b/actionpack/lib/action_controller/new_base/url_for.rb
index 94de9fab50..7119c14cd3 100644
--- a/actionpack/lib/action_controller/new_base/url_for.rb
+++ b/actionpack/lib/action_controller/new_base/url_for.rb
@@ -1,5 +1,9 @@
module ActionController
module UrlFor
+ extend ActiveSupport::Concern
+
+ include RackConvenience
+
def process_action(*)
initialize_current_url
super
@@ -21,7 +25,7 @@ module ActionController
# by this method.
def default_url_options(options = nil)
end
-
+
def rewrite_options(options) #:nodoc:
if defaults = default_url_options(options)
defaults.merge(options)
@@ -29,7 +33,7 @@ module ActionController
options
end
end
-
+
def url_for(options = {})
options ||= {}
case options
@@ -42,4 +46,4 @@ module ActionController
end
end
end
-end \ No newline at end of file
+end