halorgium-actionpack 3.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +5179 -0
- data/MIT-LICENSE +21 -0
- data/README +409 -0
- data/lib/abstract_controller.rb +16 -0
- data/lib/abstract_controller/base.rb +158 -0
- data/lib/abstract_controller/callbacks.rb +113 -0
- data/lib/abstract_controller/exceptions.rb +12 -0
- data/lib/abstract_controller/helpers.rb +151 -0
- data/lib/abstract_controller/layouts.rb +250 -0
- data/lib/abstract_controller/localized_cache.rb +49 -0
- data/lib/abstract_controller/logger.rb +61 -0
- data/lib/abstract_controller/rendering_controller.rb +188 -0
- data/lib/action_controller.rb +72 -0
- data/lib/action_controller/base.rb +168 -0
- data/lib/action_controller/caching.rb +80 -0
- data/lib/action_controller/caching/actions.rb +163 -0
- data/lib/action_controller/caching/fragments.rb +116 -0
- data/lib/action_controller/caching/pages.rb +154 -0
- data/lib/action_controller/caching/sweeping.rb +97 -0
- data/lib/action_controller/deprecated.rb +4 -0
- data/lib/action_controller/deprecated/integration_test.rb +2 -0
- data/lib/action_controller/deprecated/performance_test.rb +1 -0
- data/lib/action_controller/dispatch/dispatcher.rb +57 -0
- data/lib/action_controller/metal.rb +129 -0
- data/lib/action_controller/metal/benchmarking.rb +73 -0
- data/lib/action_controller/metal/compatibility.rb +145 -0
- data/lib/action_controller/metal/conditional_get.rb +86 -0
- data/lib/action_controller/metal/configuration.rb +28 -0
- data/lib/action_controller/metal/cookies.rb +105 -0
- data/lib/action_controller/metal/exceptions.rb +55 -0
- data/lib/action_controller/metal/filter_parameter_logging.rb +77 -0
- data/lib/action_controller/metal/flash.rb +162 -0
- data/lib/action_controller/metal/head.rb +27 -0
- data/lib/action_controller/metal/helpers.rb +115 -0
- data/lib/action_controller/metal/hide_actions.rb +47 -0
- data/lib/action_controller/metal/http_authentication.rb +312 -0
- data/lib/action_controller/metal/layouts.rb +171 -0
- data/lib/action_controller/metal/mime_responds.rb +317 -0
- data/lib/action_controller/metal/rack_convenience.rb +27 -0
- data/lib/action_controller/metal/redirector.rb +22 -0
- data/lib/action_controller/metal/render_options.rb +103 -0
- data/lib/action_controller/metal/rendering_controller.rb +57 -0
- data/lib/action_controller/metal/request_forgery_protection.rb +108 -0
- data/lib/action_controller/metal/rescuable.rb +13 -0
- data/lib/action_controller/metal/responder.rb +200 -0
- data/lib/action_controller/metal/session.rb +15 -0
- data/lib/action_controller/metal/session_management.rb +45 -0
- data/lib/action_controller/metal/streaming.rb +188 -0
- data/lib/action_controller/metal/testing.rb +39 -0
- data/lib/action_controller/metal/url_for.rb +41 -0
- data/lib/action_controller/metal/verification.rb +130 -0
- data/lib/action_controller/middleware.rb +38 -0
- data/lib/action_controller/notifications.rb +10 -0
- data/lib/action_controller/polymorphic_routes.rb +183 -0
- data/lib/action_controller/record_identifier.rb +91 -0
- data/lib/action_controller/testing/process.rb +111 -0
- data/lib/action_controller/testing/test_case.rb +345 -0
- data/lib/action_controller/translation.rb +13 -0
- data/lib/action_controller/url_rewriter.rb +204 -0
- data/lib/action_controller/vendor/html-scanner.rb +16 -0
- data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
- data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +176 -0
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
- data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
- data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
- data/lib/action_dispatch.rb +70 -0
- data/lib/action_dispatch/http/headers.rb +33 -0
- data/lib/action_dispatch/http/mime_type.rb +231 -0
- data/lib/action_dispatch/http/mime_types.rb +23 -0
- data/lib/action_dispatch/http/request.rb +539 -0
- data/lib/action_dispatch/http/response.rb +290 -0
- data/lib/action_dispatch/http/status_codes.rb +42 -0
- data/lib/action_dispatch/http/utils.rb +20 -0
- data/lib/action_dispatch/middleware/callbacks.rb +50 -0
- data/lib/action_dispatch/middleware/params_parser.rb +79 -0
- data/lib/action_dispatch/middleware/rescue.rb +26 -0
- data/lib/action_dispatch/middleware/session/abstract_store.rb +208 -0
- data/lib/action_dispatch/middleware/session/cookie_store.rb +235 -0
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
- data/lib/action_dispatch/middleware/show_exceptions.rb +143 -0
- data/lib/action_dispatch/middleware/stack.rb +116 -0
- data/lib/action_dispatch/middleware/static.rb +44 -0
- data/lib/action_dispatch/middleware/string_coercion.rb +29 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +24 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +26 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +29 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +2 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +10 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +21 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +2 -0
- data/lib/action_dispatch/routing.rb +381 -0
- data/lib/action_dispatch/routing/deprecated_mapper.rb +878 -0
- data/lib/action_dispatch/routing/mapper.rb +327 -0
- data/lib/action_dispatch/routing/route.rb +49 -0
- data/lib/action_dispatch/routing/route_set.rb +497 -0
- data/lib/action_dispatch/testing/assertions.rb +8 -0
- data/lib/action_dispatch/testing/assertions/dom.rb +35 -0
- data/lib/action_dispatch/testing/assertions/model.rb +19 -0
- data/lib/action_dispatch/testing/assertions/response.rb +145 -0
- data/lib/action_dispatch/testing/assertions/routing.rb +144 -0
- data/lib/action_dispatch/testing/assertions/selector.rb +639 -0
- data/lib/action_dispatch/testing/assertions/tag.rb +123 -0
- data/lib/action_dispatch/testing/integration.rb +504 -0
- data/lib/action_dispatch/testing/performance_test.rb +15 -0
- data/lib/action_dispatch/testing/test_request.rb +83 -0
- data/lib/action_dispatch/testing/test_response.rb +131 -0
- data/lib/action_pack.rb +24 -0
- data/lib/action_pack/version.rb +9 -0
- data/lib/action_view.rb +58 -0
- data/lib/action_view/base.rb +308 -0
- data/lib/action_view/context.rb +44 -0
- data/lib/action_view/erb/util.rb +48 -0
- data/lib/action_view/helpers.rb +62 -0
- data/lib/action_view/helpers/active_model_helper.rb +306 -0
- data/lib/action_view/helpers/ajax_helper.rb +68 -0
- data/lib/action_view/helpers/asset_tag_helper.rb +830 -0
- data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
- data/lib/action_view/helpers/cache_helper.rb +39 -0
- data/lib/action_view/helpers/capture_helper.rb +168 -0
- data/lib/action_view/helpers/date_helper.rb +988 -0
- data/lib/action_view/helpers/debug_helper.rb +38 -0
- data/lib/action_view/helpers/form_helper.rb +1102 -0
- data/lib/action_view/helpers/form_options_helper.rb +600 -0
- data/lib/action_view/helpers/form_tag_helper.rb +495 -0
- data/lib/action_view/helpers/javascript_helper.rb +208 -0
- data/lib/action_view/helpers/number_helper.rb +311 -0
- data/lib/action_view/helpers/prototype_helper.rb +1309 -0
- data/lib/action_view/helpers/raw_output_helper.rb +9 -0
- data/lib/action_view/helpers/record_identification_helper.rb +20 -0
- data/lib/action_view/helpers/record_tag_helper.rb +58 -0
- data/lib/action_view/helpers/sanitize_helper.rb +259 -0
- data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
- data/lib/action_view/helpers/tag_helper.rb +151 -0
- data/lib/action_view/helpers/text_helper.rb +594 -0
- data/lib/action_view/helpers/translation_helper.rb +39 -0
- data/lib/action_view/helpers/url_helper.rb +639 -0
- data/lib/action_view/locale/en.yml +117 -0
- data/lib/action_view/paths.rb +80 -0
- data/lib/action_view/render/partials.rb +342 -0
- data/lib/action_view/render/rendering.rb +134 -0
- data/lib/action_view/safe_buffer.rb +28 -0
- data/lib/action_view/template/error.rb +101 -0
- data/lib/action_view/template/handler.rb +36 -0
- data/lib/action_view/template/handlers.rb +52 -0
- data/lib/action_view/template/handlers/builder.rb +17 -0
- data/lib/action_view/template/handlers/erb.rb +53 -0
- data/lib/action_view/template/handlers/rjs.rb +18 -0
- data/lib/action_view/template/resolver.rb +165 -0
- data/lib/action_view/template/template.rb +131 -0
- data/lib/action_view/template/text.rb +38 -0
- data/lib/action_view/test_case.rb +163 -0
- metadata +236 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
module AbstractController
|
2
|
+
class HashKey
|
3
|
+
@hash_keys = Hash.new {|h,k| h[k] = Hash.new {|h,k| h[k] = {} } }
|
4
|
+
|
5
|
+
def self.get(klass, formats, locale)
|
6
|
+
@hash_keys[klass][formats][locale] ||= new(klass, formats, locale)
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_accessor :hash
|
10
|
+
def initialize(klass, formats, locale)
|
11
|
+
@formats, @locale = formats, locale
|
12
|
+
@hash = [formats, locale].hash
|
13
|
+
end
|
14
|
+
|
15
|
+
alias_method :eql?, :equal?
|
16
|
+
|
17
|
+
def inspect
|
18
|
+
"#<HashKey -- formats: #{@formats.inspect} locale: #{@locale.inspect}>"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module LocalizedCache
|
23
|
+
extend ActiveSupport::Concern
|
24
|
+
|
25
|
+
module ClassMethods
|
26
|
+
def clear_template_caches!
|
27
|
+
ActionView::Partials::PartialRenderer::TEMPLATES.clear
|
28
|
+
template_cache.clear
|
29
|
+
super
|
30
|
+
end
|
31
|
+
|
32
|
+
def template_cache
|
33
|
+
@template_cache ||= Hash.new {|h,k| h[k] = {} }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def render(options)
|
38
|
+
Thread.current[:format_locale_key] = HashKey.get(self.class, formats, I18n.locale)
|
39
|
+
super
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def with_template_cache(name)
|
45
|
+
self.class.template_cache[Thread.current[:format_locale_key]][name] ||= super
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'active_support/core_ext/logger'
|
2
|
+
require 'active_support/benchmarkable'
|
3
|
+
|
4
|
+
module AbstractController
|
5
|
+
module Logger
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
cattr_accessor :logger
|
10
|
+
extend ActiveSupport::Benchmarkable
|
11
|
+
end
|
12
|
+
|
13
|
+
# A class that allows you to defer expensive processing
|
14
|
+
# until the logger actually tries to log. Otherwise, you are
|
15
|
+
# forced to do the processing in advance, and send the
|
16
|
+
# entire processed String to the logger, which might
|
17
|
+
# just discard the String if the log level is too low.
|
18
|
+
#
|
19
|
+
# TODO: Require that Rails loggers accept a block.
|
20
|
+
class DelayedLog < ActiveSupport::BasicObject
|
21
|
+
def initialize(&block)
|
22
|
+
@str, @block = nil, block
|
23
|
+
end
|
24
|
+
|
25
|
+
def method_missing(*args, &block)
|
26
|
+
unless @str
|
27
|
+
@str, @block = @block.call, nil
|
28
|
+
end
|
29
|
+
@str.send(*args, &block)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Override process_action in the AbstractController::Base
|
34
|
+
# to log details about the method.
|
35
|
+
def process_action(action)
|
36
|
+
result = ActiveSupport::Notifications.instrument(:process_action,
|
37
|
+
:controller => self, :action => action) do
|
38
|
+
super
|
39
|
+
end
|
40
|
+
|
41
|
+
if logger
|
42
|
+
log = DelayedLog.new do
|
43
|
+
"\n\nProcessing #{self.class.name}\##{action_name} " \
|
44
|
+
"to #{request.formats} (for #{request_origin}) " \
|
45
|
+
"[#{request.method.to_s.upcase}]"
|
46
|
+
end
|
47
|
+
|
48
|
+
logger.info(log)
|
49
|
+
end
|
50
|
+
|
51
|
+
result
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
# Returns the request origin with the IP and time. This needs to be cached,
|
56
|
+
# otherwise we would get different results for each time it calls.
|
57
|
+
def request_origin
|
58
|
+
@request_origin ||= "#{request.remote_ip} at #{Time.now.to_s(:db)}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,188 @@
|
|
1
|
+
require "abstract_controller/logger"
|
2
|
+
|
3
|
+
module AbstractController
|
4
|
+
module RenderingController
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
include AbstractController::Logger
|
8
|
+
|
9
|
+
included do
|
10
|
+
attr_internal :formats
|
11
|
+
extlib_inheritable_accessor :_view_paths
|
12
|
+
self._view_paths ||= ActionView::PathSet.new
|
13
|
+
end
|
14
|
+
|
15
|
+
# An instance of a view class. The default view class is ActionView::Base
|
16
|
+
#
|
17
|
+
# The view class must have the following methods:
|
18
|
+
# View.for_controller[controller] Create a new ActionView instance for a
|
19
|
+
# controller
|
20
|
+
# View#render_partial[options]
|
21
|
+
# - responsible for setting options[:_template]
|
22
|
+
# - Returns String with the rendered partial
|
23
|
+
# options<Hash>:: see _render_partial in ActionView::Base
|
24
|
+
# View#render_template[template, layout, options, partial]
|
25
|
+
# - Returns String with the rendered template
|
26
|
+
# template<ActionView::Template>:: The template to render
|
27
|
+
# layout<ActionView::Template>:: The layout to render around the template
|
28
|
+
# options<Hash>:: See _render_template_with_layout in ActionView::Base
|
29
|
+
# partial<Boolean>:: Whether or not the template to render is a partial
|
30
|
+
#
|
31
|
+
# Override this method in a to change the default behavior.
|
32
|
+
def view_context
|
33
|
+
@_view_context ||= ActionView::Base.for_controller(self)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Mostly abstracts the fact that calling render twice is a DoubleRenderError.
|
37
|
+
# Delegates render_to_body and sticks the result in self.response_body.
|
38
|
+
def render(*args)
|
39
|
+
if response_body
|
40
|
+
raise AbstractController::DoubleRenderError, "OMG"
|
41
|
+
end
|
42
|
+
|
43
|
+
self.response_body = render_to_body(*args)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Raw rendering of a template to a Rack-compatible body.
|
47
|
+
#
|
48
|
+
# ==== Options
|
49
|
+
# _partial_object<Object>:: The object that is being rendered. If this
|
50
|
+
# exists, we are in the special case of rendering an object as a partial.
|
51
|
+
#
|
52
|
+
# :api: plugin
|
53
|
+
def render_to_body(options = {})
|
54
|
+
# TODO: Refactor so we can just use the normal template logic for this
|
55
|
+
if options.key?(:partial)
|
56
|
+
view_context.render_partial(options)
|
57
|
+
else
|
58
|
+
_determine_template(options)
|
59
|
+
_render_template(options)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Raw rendering of a template to a string. Just convert the results of
|
64
|
+
# render_to_body into a String.
|
65
|
+
#
|
66
|
+
# :api: plugin
|
67
|
+
def render_to_string(options = {})
|
68
|
+
AbstractController::RenderingController.body_to_s(render_to_body(options))
|
69
|
+
end
|
70
|
+
|
71
|
+
# Renders the template from an object.
|
72
|
+
#
|
73
|
+
# ==== Options
|
74
|
+
# _template<ActionView::Template>:: The template to render
|
75
|
+
# _layout<ActionView::Template>:: The layout to wrap the template in (optional)
|
76
|
+
# _partial<TrueClass, FalseClass>:: Whether or not the template to be rendered is a partial
|
77
|
+
def _render_template(options)
|
78
|
+
view_context.render_template(options)
|
79
|
+
end
|
80
|
+
|
81
|
+
# The list of view paths for this controller. See ActionView::ViewPathSet for
|
82
|
+
# more details about writing custom view paths.
|
83
|
+
def view_paths
|
84
|
+
_view_paths
|
85
|
+
end
|
86
|
+
|
87
|
+
# Return a string representation of a Rack-compatible response body.
|
88
|
+
def self.body_to_s(body)
|
89
|
+
if body.respond_to?(:to_str)
|
90
|
+
body
|
91
|
+
else
|
92
|
+
strings = []
|
93
|
+
body.each { |part| strings << part.to_s }
|
94
|
+
body.close if body.respond_to?(:close)
|
95
|
+
strings.join
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
# Take in a set of options and determine the template to render
|
102
|
+
#
|
103
|
+
# ==== Options
|
104
|
+
# _template<ActionView::Template>:: If this is provided, the search is over
|
105
|
+
# _template_name<#to_s>:: The name of the template to look up. Otherwise,
|
106
|
+
# use the current action name.
|
107
|
+
# _prefix<String>:: The prefix to look inside of. In a file system, this corresponds
|
108
|
+
# to a directory.
|
109
|
+
# _partial<TrueClass, FalseClass>:: Whether or not the file to look up is a partial
|
110
|
+
def _determine_template(options)
|
111
|
+
if options.key?(:text)
|
112
|
+
options[:_template] = ActionView::TextTemplate.new(options[:text], format_for_text)
|
113
|
+
elsif options.key?(:inline)
|
114
|
+
handler = ActionView::Template.handler_class_for_extension(options[:type] || "erb")
|
115
|
+
template = ActionView::Template.new(options[:inline], "inline #{options[:inline].inspect}", handler, {})
|
116
|
+
options[:_template] = template
|
117
|
+
elsif options.key?(:template)
|
118
|
+
options[:_template_name] = options[:template]
|
119
|
+
elsif options.key?(:file)
|
120
|
+
options[:_template_name] = options[:file]
|
121
|
+
end
|
122
|
+
|
123
|
+
name = (options[:_template_name] || action_name).to_s
|
124
|
+
|
125
|
+
options[:_template] ||= with_template_cache(name) do
|
126
|
+
find_template(name, { :formats => formats }, options)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def find_template(name, details, options)
|
131
|
+
view_paths.find(name, details, options[:_prefix], options[:_partial])
|
132
|
+
end
|
133
|
+
|
134
|
+
def template_exists?(name, details, options)
|
135
|
+
view_paths.exists?(name, details, options[:_prefix], options[:_partial])
|
136
|
+
end
|
137
|
+
|
138
|
+
def with_template_cache(name)
|
139
|
+
yield
|
140
|
+
end
|
141
|
+
|
142
|
+
def format_for_text
|
143
|
+
Mime[:text]
|
144
|
+
end
|
145
|
+
|
146
|
+
module ClassMethods
|
147
|
+
def clear_template_caches!
|
148
|
+
end
|
149
|
+
|
150
|
+
# Append a path to the list of view paths for this controller.
|
151
|
+
#
|
152
|
+
# ==== Parameters
|
153
|
+
# path<String, ViewPath>:: If a String is provided, it gets converted into
|
154
|
+
# the default view path. You may also provide a custom view path
|
155
|
+
# (see ActionView::ViewPathSet for more information)
|
156
|
+
def append_view_path(path)
|
157
|
+
self.view_paths << path
|
158
|
+
end
|
159
|
+
|
160
|
+
# Prepend a path to the list of view paths for this controller.
|
161
|
+
#
|
162
|
+
# ==== Parameters
|
163
|
+
# path<String, ViewPath>:: If a String is provided, it gets converted into
|
164
|
+
# the default view path. You may also provide a custom view path
|
165
|
+
# (see ActionView::ViewPathSet for more information)
|
166
|
+
def prepend_view_path(path)
|
167
|
+
clear_template_caches!
|
168
|
+
self.view_paths.unshift(path)
|
169
|
+
end
|
170
|
+
|
171
|
+
# A list of all of the default view paths for this controller.
|
172
|
+
def view_paths
|
173
|
+
self._view_paths
|
174
|
+
end
|
175
|
+
|
176
|
+
# Set the view paths.
|
177
|
+
#
|
178
|
+
# ==== Parameters
|
179
|
+
# paths<ViewPathSet, Object>:: If a ViewPathSet is provided, use that;
|
180
|
+
# otherwise, process the parameter into a ViewPathSet.
|
181
|
+
def view_paths=(paths)
|
182
|
+
clear_template_caches!
|
183
|
+
self._view_paths = paths.is_a?(ActionView::PathSet) ?
|
184
|
+
paths : ActionView::Base.process_view_paths(paths)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module ActionController
|
2
|
+
autoload :Base, "action_controller/base"
|
3
|
+
autoload :Benchmarking, "action_controller/metal/benchmarking"
|
4
|
+
autoload :ConditionalGet, "action_controller/metal/conditional_get"
|
5
|
+
autoload :Configuration, "action_controller/metal/configuration"
|
6
|
+
autoload :Head, "action_controller/metal/head"
|
7
|
+
autoload :Helpers, "action_controller/metal/helpers"
|
8
|
+
autoload :HideActions, "action_controller/metal/hide_actions"
|
9
|
+
autoload :Layouts, "action_controller/metal/layouts"
|
10
|
+
autoload :Metal, "action_controller/metal"
|
11
|
+
autoload :Middleware, "action_controller/middleware"
|
12
|
+
autoload :RackConvenience, "action_controller/metal/rack_convenience"
|
13
|
+
autoload :Rails2Compatibility, "action_controller/metal/compatibility"
|
14
|
+
autoload :Redirector, "action_controller/metal/redirector"
|
15
|
+
autoload :RenderingController, "action_controller/metal/rendering_controller"
|
16
|
+
autoload :RenderOptions, "action_controller/metal/render_options"
|
17
|
+
autoload :Rescue, "action_controller/metal/rescuable"
|
18
|
+
autoload :Responder, "action_controller/metal/responder"
|
19
|
+
autoload :Session, "action_controller/metal/session"
|
20
|
+
autoload :Testing, "action_controller/metal/testing"
|
21
|
+
autoload :UrlFor, "action_controller/metal/url_for"
|
22
|
+
|
23
|
+
autoload :Caching, 'action_controller/caching'
|
24
|
+
autoload :Dispatcher, 'action_controller/dispatch/dispatcher'
|
25
|
+
autoload :Integration, 'action_controller/deprecated/integration_test'
|
26
|
+
autoload :IntegrationTest, 'action_controller/deprecated/integration_test'
|
27
|
+
autoload :MimeResponds, 'action_controller/metal/mime_responds'
|
28
|
+
autoload :PerformanceTest, 'action_controller/deprecated/performance_test'
|
29
|
+
autoload :PolymorphicRoutes, 'action_controller/polymorphic_routes'
|
30
|
+
autoload :RecordIdentifier, 'action_controller/record_identifier'
|
31
|
+
autoload :Routing, 'action_controller/deprecated'
|
32
|
+
autoload :SessionManagement, 'action_controller/metal/session_management'
|
33
|
+
autoload :TestCase, 'action_controller/testing/test_case'
|
34
|
+
autoload :TestProcess, 'action_controller/testing/process'
|
35
|
+
autoload :UrlRewriter, 'action_controller/url_rewriter'
|
36
|
+
autoload :UrlWriter, 'action_controller/url_rewriter'
|
37
|
+
|
38
|
+
autoload :Verification, 'action_controller/metal/verification'
|
39
|
+
autoload :Flash, 'action_controller/metal/flash'
|
40
|
+
autoload :RequestForgeryProtection, 'action_controller/metal/request_forgery_protection'
|
41
|
+
autoload :Streaming, 'action_controller/metal/streaming'
|
42
|
+
autoload :HttpAuthentication, 'action_controller/metal/http_authentication'
|
43
|
+
autoload :FilterParameterLogging, 'action_controller/metal/filter_parameter_logging'
|
44
|
+
autoload :Translation, 'action_controller/translation'
|
45
|
+
autoload :Cookies, 'action_controller/metal/cookies'
|
46
|
+
|
47
|
+
autoload :ActionControllerError, 'action_controller/metal/exceptions'
|
48
|
+
autoload :RenderError, 'action_controller/metal/exceptions'
|
49
|
+
autoload :RoutingError, 'action_controller/metal/exceptions'
|
50
|
+
autoload :MethodNotAllowed, 'action_controller/metal/exceptions'
|
51
|
+
autoload :NotImplemented, 'action_controller/metal/exceptions'
|
52
|
+
autoload :UnknownController, 'action_controller/metal/exceptions'
|
53
|
+
autoload :MissingFile, 'action_controller/metal/exceptions'
|
54
|
+
autoload :RenderError, 'action_controller/metal/exceptions'
|
55
|
+
autoload :SessionOverflowError, 'action_controller/metal/exceptions'
|
56
|
+
autoload :UnknownHttpMethod, 'action_controller/metal/exceptions'
|
57
|
+
end
|
58
|
+
|
59
|
+
autoload :HTML, 'action_controller/vendor/html-scanner'
|
60
|
+
autoload :AbstractController, 'abstract_controller'
|
61
|
+
|
62
|
+
require 'action_dispatch'
|
63
|
+
require 'action_view'
|
64
|
+
|
65
|
+
# Common ActiveSupport usage in ActionController
|
66
|
+
require "active_support/concern"
|
67
|
+
require 'active_support/core_ext/class/attribute_accessors'
|
68
|
+
require 'active_support/core_ext/load_error'
|
69
|
+
require 'active_support/core_ext/module/attr_internal'
|
70
|
+
require 'active_support/core_ext/module/delegation'
|
71
|
+
require 'active_support/core_ext/name_error'
|
72
|
+
require 'active_support/inflector'
|
@@ -0,0 +1,168 @@
|
|
1
|
+
module ActionController
|
2
|
+
class Base < Metal
|
3
|
+
abstract!
|
4
|
+
|
5
|
+
include AbstractController::Callbacks
|
6
|
+
include AbstractController::Logger
|
7
|
+
|
8
|
+
include ActionController::Helpers
|
9
|
+
include ActionController::HideActions
|
10
|
+
include ActionController::UrlFor
|
11
|
+
include ActionController::Redirector
|
12
|
+
include ActionController::RenderingController
|
13
|
+
include ActionController::RenderOptions::All
|
14
|
+
include ActionController::Layouts
|
15
|
+
include ActionController::ConditionalGet
|
16
|
+
include ActionController::RackConvenience
|
17
|
+
include ActionController::Benchmarking
|
18
|
+
include ActionController::Configuration
|
19
|
+
|
20
|
+
# Legacy modules
|
21
|
+
include SessionManagement
|
22
|
+
include ActionDispatch::StatusCodes
|
23
|
+
include ActionController::Caching
|
24
|
+
include ActionController::MimeResponds
|
25
|
+
|
26
|
+
# Rails 2.x compatibility
|
27
|
+
include ActionController::Rails2Compatibility
|
28
|
+
|
29
|
+
include ActionController::Cookies
|
30
|
+
include ActionController::Session
|
31
|
+
include ActionController::Flash
|
32
|
+
include ActionController::Verification
|
33
|
+
include ActionController::RequestForgeryProtection
|
34
|
+
include ActionController::Streaming
|
35
|
+
include ActionController::HttpAuthentication::Basic::ControllerMethods
|
36
|
+
include ActionController::HttpAuthentication::Digest::ControllerMethods
|
37
|
+
include ActionController::FilterParameterLogging
|
38
|
+
include ActionController::Translation
|
39
|
+
|
40
|
+
# TODO: Extract into its own module
|
41
|
+
# This should be moved together with other normalizing behavior
|
42
|
+
module ImplicitRender
|
43
|
+
def send_action(*)
|
44
|
+
ret = super
|
45
|
+
default_render unless response_body
|
46
|
+
ret
|
47
|
+
end
|
48
|
+
|
49
|
+
def default_render
|
50
|
+
render
|
51
|
+
end
|
52
|
+
|
53
|
+
def method_for_action(action_name)
|
54
|
+
super || begin
|
55
|
+
if template_exists?(action_name.to_s, {:formats => formats}, :_prefix => controller_path)
|
56
|
+
"default_render"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
include ImplicitRender
|
63
|
+
|
64
|
+
include ActionController::Rescue
|
65
|
+
|
66
|
+
def self.inherited(klass)
|
67
|
+
::ActionController::Base.subclasses << klass.to_s
|
68
|
+
super
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.subclasses
|
72
|
+
@subclasses ||= []
|
73
|
+
end
|
74
|
+
|
75
|
+
def _normalize_options(action = nil, options = {}, &blk)
|
76
|
+
if action.is_a?(Hash)
|
77
|
+
options, action = action, nil
|
78
|
+
elsif action.is_a?(String) || action.is_a?(Symbol)
|
79
|
+
key = case action = action.to_s
|
80
|
+
when %r{^/} then :file
|
81
|
+
when %r{/} then :template
|
82
|
+
else :action
|
83
|
+
end
|
84
|
+
options.merge! key => action
|
85
|
+
elsif action
|
86
|
+
options.merge! :partial => action
|
87
|
+
end
|
88
|
+
|
89
|
+
if options.key?(:action) && options[:action].to_s.index("/")
|
90
|
+
options[:template] = options.delete(:action)
|
91
|
+
end
|
92
|
+
|
93
|
+
if options[:status]
|
94
|
+
options[:status] = interpret_status(options[:status]).to_i
|
95
|
+
end
|
96
|
+
|
97
|
+
options[:update] = blk if block_given?
|
98
|
+
options
|
99
|
+
end
|
100
|
+
|
101
|
+
def render(action = nil, options = {}, &blk)
|
102
|
+
options = _normalize_options(action, options, &blk)
|
103
|
+
super(options)
|
104
|
+
end
|
105
|
+
|
106
|
+
def render_to_string(action = nil, options = {}, &blk)
|
107
|
+
options = _normalize_options(action, options, &blk)
|
108
|
+
super(options)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Redirects the browser to the target specified in +options+. This parameter can take one of three forms:
|
112
|
+
#
|
113
|
+
# * <tt>Hash</tt> - The URL will be generated by calling url_for with the +options+.
|
114
|
+
# * <tt>Record</tt> - The URL will be generated by calling url_for with the +options+, which will reference a named URL for that record.
|
115
|
+
# * <tt>String</tt> starting with <tt>protocol://</tt> (like <tt>http://</tt>) - Is passed straight through as the target for redirection.
|
116
|
+
# * <tt>String</tt> not containing a protocol - The current protocol and host is prepended to the string.
|
117
|
+
# * <tt>:back</tt> - Back to the page that issued the request. Useful for forms that are triggered from multiple places.
|
118
|
+
# Short-hand for <tt>redirect_to(request.env["HTTP_REFERER"])</tt>
|
119
|
+
#
|
120
|
+
# Examples:
|
121
|
+
# redirect_to :action => "show", :id => 5
|
122
|
+
# redirect_to post
|
123
|
+
# redirect_to "http://www.rubyonrails.org"
|
124
|
+
# redirect_to "/images/screenshot.jpg"
|
125
|
+
# redirect_to articles_url
|
126
|
+
# redirect_to :back
|
127
|
+
#
|
128
|
+
# The redirection happens as a "302 Moved" header unless otherwise specified.
|
129
|
+
#
|
130
|
+
# Examples:
|
131
|
+
# redirect_to post_url(@post), :status=>:found
|
132
|
+
# redirect_to :action=>'atom', :status=>:moved_permanently
|
133
|
+
# redirect_to post_url(@post), :status=>301
|
134
|
+
# redirect_to :action=>'atom', :status=>302
|
135
|
+
#
|
136
|
+
# When using <tt>redirect_to :back</tt>, if there is no referrer,
|
137
|
+
# RedirectBackError will be raised. You may specify some fallback
|
138
|
+
# behavior for this case by rescuing RedirectBackError.
|
139
|
+
def redirect_to(options = {}, response_status = {}) #:doc:
|
140
|
+
raise ActionControllerError.new("Cannot redirect to nil!") if options.nil?
|
141
|
+
|
142
|
+
status = if options.is_a?(Hash) && options.key?(:status)
|
143
|
+
interpret_status(options.delete(:status))
|
144
|
+
elsif response_status.key?(:status)
|
145
|
+
interpret_status(response_status[:status])
|
146
|
+
else
|
147
|
+
302
|
148
|
+
end
|
149
|
+
|
150
|
+
url = case options
|
151
|
+
# The scheme name consist of a letter followed by any combination of
|
152
|
+
# letters, digits, and the plus ("+"), period ("."), or hyphen ("-")
|
153
|
+
# characters; and is terminated by a colon (":").
|
154
|
+
when %r{^\w[\w\d+.-]*:.*}
|
155
|
+
options
|
156
|
+
when String
|
157
|
+
request.protocol + request.host_with_port + options
|
158
|
+
when :back
|
159
|
+
raise RedirectBackError unless refer = request.headers["Referer"]
|
160
|
+
refer
|
161
|
+
else
|
162
|
+
url_for(options)
|
163
|
+
end
|
164
|
+
|
165
|
+
super(url, status)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|