actionpack 3.2.19 → 4.2.11.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +412 -503
- data/MIT-LICENSE +1 -1
- data/README.rdoc +11 -294
- data/lib/abstract_controller/asset_paths.rb +2 -2
- data/lib/abstract_controller/base.rb +52 -18
- data/lib/abstract_controller/callbacks.rb +87 -89
- data/lib/abstract_controller/collector.rb +17 -3
- data/lib/abstract_controller/helpers.rb +41 -14
- data/lib/abstract_controller/logger.rb +1 -2
- data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
- data/lib/abstract_controller/rendering.rb +65 -118
- data/lib/abstract_controller/translation.rb +16 -1
- data/lib/abstract_controller/url_for.rb +7 -7
- data/lib/abstract_controller.rb +2 -10
- data/lib/action_controller/base.rb +61 -28
- data/lib/action_controller/caching/fragments.rb +30 -54
- data/lib/action_controller/caching.rb +38 -35
- data/lib/action_controller/log_subscriber.rb +35 -18
- data/lib/action_controller/metal/conditional_get.rb +103 -34
- data/lib/action_controller/metal/data_streaming.rb +20 -26
- data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
- data/lib/action_controller/metal/exceptions.rb +19 -6
- data/lib/action_controller/metal/flash.rb +41 -9
- data/lib/action_controller/metal/force_ssl.rb +70 -12
- data/lib/action_controller/metal/head.rb +30 -7
- data/lib/action_controller/metal/helpers.rb +11 -11
- data/lib/action_controller/metal/hide_actions.rb +0 -1
- data/lib/action_controller/metal/http_authentication.rb +140 -94
- data/lib/action_controller/metal/implicit_render.rb +1 -1
- data/lib/action_controller/metal/instrumentation.rb +11 -7
- data/lib/action_controller/metal/live.rb +328 -0
- data/lib/action_controller/metal/mime_responds.rb +161 -152
- data/lib/action_controller/metal/params_wrapper.rb +126 -81
- data/lib/action_controller/metal/rack_delegation.rb +10 -4
- data/lib/action_controller/metal/redirecting.rb +44 -41
- data/lib/action_controller/metal/renderers.rb +48 -19
- data/lib/action_controller/metal/rendering.rb +46 -11
- data/lib/action_controller/metal/request_forgery_protection.rb +250 -29
- data/lib/action_controller/metal/streaming.rb +30 -38
- data/lib/action_controller/metal/strong_parameters.rb +669 -0
- data/lib/action_controller/metal/testing.rb +12 -18
- data/lib/action_controller/metal/url_for.rb +31 -29
- data/lib/action_controller/metal.rb +31 -40
- data/lib/action_controller/model_naming.rb +12 -0
- data/lib/action_controller/railtie.rb +38 -18
- data/lib/action_controller/railties/helpers.rb +22 -0
- data/lib/action_controller/test_case.rb +359 -173
- data/lib/action_controller.rb +9 -16
- data/lib/action_dispatch/http/cache.rb +64 -11
- data/lib/action_dispatch/http/filter_parameters.rb +20 -10
- data/lib/action_dispatch/http/filter_redirect.rb +38 -0
- data/lib/action_dispatch/http/headers.rb +85 -17
- data/lib/action_dispatch/http/mime_negotiation.rb +55 -5
- data/lib/action_dispatch/http/mime_type.rb +167 -114
- data/lib/action_dispatch/http/mime_types.rb +2 -1
- data/lib/action_dispatch/http/parameter_filter.rb +44 -46
- data/lib/action_dispatch/http/parameters.rb +30 -46
- data/lib/action_dispatch/http/rack_cache.rb +2 -3
- data/lib/action_dispatch/http/request.rb +108 -45
- data/lib/action_dispatch/http/response.rb +247 -48
- data/lib/action_dispatch/http/upload.rb +60 -29
- data/lib/action_dispatch/http/url.rb +135 -45
- data/lib/action_dispatch/journey/backwards.rb +5 -0
- data/lib/action_dispatch/journey/formatter.rb +166 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +47 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +157 -0
- data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
- data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
- data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
- data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
- data/lib/action_dispatch/journey/nodes/node.rb +128 -0
- data/lib/action_dispatch/journey/parser.rb +198 -0
- data/lib/action_dispatch/journey/parser.y +49 -0
- data/lib/action_dispatch/journey/parser_extras.rb +23 -0
- data/lib/action_dispatch/journey/path/pattern.rb +193 -0
- data/lib/action_dispatch/journey/route.rb +125 -0
- data/lib/action_dispatch/journey/router/strexp.rb +27 -0
- data/lib/action_dispatch/journey/router/utils.rb +93 -0
- data/lib/action_dispatch/journey/router.rb +144 -0
- data/lib/action_dispatch/journey/routes.rb +80 -0
- data/lib/action_dispatch/journey/scanner.rb +61 -0
- data/lib/action_dispatch/journey/visitors.rb +221 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
- data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
- data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
- data/lib/action_dispatch/journey.rb +5 -0
- data/lib/action_dispatch/middleware/callbacks.rb +16 -11
- data/lib/action_dispatch/middleware/cookies.rb +346 -125
- data/lib/action_dispatch/middleware/debug_exceptions.rb +52 -24
- data/lib/action_dispatch/middleware/exception_wrapper.rb +75 -9
- data/lib/action_dispatch/middleware/flash.rb +85 -72
- data/lib/action_dispatch/middleware/params_parser.rb +16 -31
- data/lib/action_dispatch/middleware/public_exceptions.rb +39 -14
- data/lib/action_dispatch/middleware/reloader.rb +16 -7
- data/lib/action_dispatch/middleware/remote_ip.rb +132 -40
- data/lib/action_dispatch/middleware/request_id.rb +3 -7
- data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
- data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
- data/lib/action_dispatch/middleware/session/cookie_store.rb +84 -29
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
- data/lib/action_dispatch/middleware/show_exceptions.rb +15 -44
- data/lib/action_dispatch/middleware/ssl.rb +72 -0
- data/lib/action_dispatch/middleware/stack.rb +6 -1
- data/lib/action_dispatch/middleware/static.rb +80 -23
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +34 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.erb +27 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +133 -5
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
- data/lib/action_dispatch/railtie.rb +19 -6
- data/lib/action_dispatch/request/session.rb +193 -0
- data/lib/action_dispatch/request/utils.rb +35 -0
- data/lib/action_dispatch/routing/endpoint.rb +10 -0
- data/lib/action_dispatch/routing/inspector.rb +234 -0
- data/lib/action_dispatch/routing/mapper.rb +897 -436
- data/lib/action_dispatch/routing/polymorphic_routes.rb +213 -92
- data/lib/action_dispatch/routing/redirection.rb +97 -37
- data/lib/action_dispatch/routing/route_set.rb +432 -239
- data/lib/action_dispatch/routing/routes_proxy.rb +7 -4
- data/lib/action_dispatch/routing/url_for.rb +63 -34
- data/lib/action_dispatch/routing.rb +57 -89
- data/lib/action_dispatch/testing/assertions/dom.rb +2 -36
- data/lib/action_dispatch/testing/assertions/response.rb +24 -38
- data/lib/action_dispatch/testing/assertions/routing.rb +55 -54
- data/lib/action_dispatch/testing/assertions/selector.rb +2 -434
- data/lib/action_dispatch/testing/assertions/tag.rb +2 -137
- data/lib/action_dispatch/testing/assertions.rb +11 -7
- data/lib/action_dispatch/testing/integration.rb +88 -72
- data/lib/action_dispatch/testing/test_process.rb +9 -6
- data/lib/action_dispatch/testing/test_request.rb +13 -9
- data/lib/action_dispatch/testing/test_response.rb +1 -5
- data/lib/action_dispatch.rb +24 -21
- data/lib/action_pack/gem_version.rb +15 -0
- data/lib/action_pack/version.rb +5 -7
- data/lib/action_pack.rb +1 -1
- metadata +181 -292
- data/lib/abstract_controller/layouts.rb +0 -423
- data/lib/abstract_controller/view_paths.rb +0 -96
- data/lib/action_controller/caching/actions.rb +0 -185
- data/lib/action_controller/caching/pages.rb +0 -187
- data/lib/action_controller/caching/sweeping.rb +0 -97
- data/lib/action_controller/deprecated/integration_test.rb +0 -2
- data/lib/action_controller/deprecated/performance_test.rb +0 -1
- data/lib/action_controller/deprecated.rb +0 -3
- data/lib/action_controller/metal/compatibility.rb +0 -65
- data/lib/action_controller/metal/responder.rb +0 -286
- data/lib/action_controller/metal/session_management.rb +0 -14
- data/lib/action_controller/railties/paths.rb +0 -25
- data/lib/action_controller/record_identifier.rb +0 -85
- data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
- data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
- data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
- data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
- data/lib/action_controller/vendor/html-scanner.rb +0 -20
- data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
- data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
- data/lib/action_dispatch/middleware/head.rb +0 -18
- data/lib/action_dispatch/middleware/rescue.rb +0 -26
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
- data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
- data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
- data/lib/action_dispatch/testing/performance_test.rb +0 -10
- data/lib/action_view/asset_paths.rb +0 -142
- data/lib/action_view/base.rb +0 -220
- data/lib/action_view/buffers.rb +0 -43
- data/lib/action_view/context.rb +0 -36
- data/lib/action_view/flows.rb +0 -79
- data/lib/action_view/helpers/active_model_helper.rb +0 -50
- data/lib/action_view/helpers/asset_paths.rb +0 -7
- data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
- data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
- data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
- data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
- data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
- data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
- data/lib/action_view/helpers/cache_helper.rb +0 -64
- data/lib/action_view/helpers/capture_helper.rb +0 -203
- data/lib/action_view/helpers/controller_helper.rb +0 -25
- data/lib/action_view/helpers/csrf_helper.rb +0 -32
- data/lib/action_view/helpers/date_helper.rb +0 -1062
- data/lib/action_view/helpers/debug_helper.rb +0 -40
- data/lib/action_view/helpers/form_helper.rb +0 -1486
- data/lib/action_view/helpers/form_options_helper.rb +0 -658
- data/lib/action_view/helpers/form_tag_helper.rb +0 -685
- data/lib/action_view/helpers/javascript_helper.rb +0 -110
- data/lib/action_view/helpers/number_helper.rb +0 -622
- data/lib/action_view/helpers/output_safety_helper.rb +0 -38
- data/lib/action_view/helpers/record_tag_helper.rb +0 -111
- data/lib/action_view/helpers/rendering_helper.rb +0 -90
- data/lib/action_view/helpers/sanitize_helper.rb +0 -259
- data/lib/action_view/helpers/tag_helper.rb +0 -160
- data/lib/action_view/helpers/text_helper.rb +0 -426
- data/lib/action_view/helpers/translation_helper.rb +0 -91
- data/lib/action_view/helpers/url_helper.rb +0 -693
- data/lib/action_view/helpers.rb +0 -60
- data/lib/action_view/locale/en.yml +0 -160
- data/lib/action_view/log_subscriber.rb +0 -28
- data/lib/action_view/lookup_context.rb +0 -254
- data/lib/action_view/path_set.rb +0 -89
- data/lib/action_view/railtie.rb +0 -55
- data/lib/action_view/renderer/abstract_renderer.rb +0 -41
- data/lib/action_view/renderer/partial_renderer.rb +0 -415
- data/lib/action_view/renderer/renderer.rb +0 -54
- data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
- data/lib/action_view/renderer/template_renderer.rb +0 -94
- data/lib/action_view/template/error.rb +0 -128
- data/lib/action_view/template/handlers/builder.rb +0 -26
- data/lib/action_view/template/handlers/erb.rb +0 -125
- data/lib/action_view/template/handlers.rb +0 -50
- data/lib/action_view/template/resolver.rb +0 -272
- data/lib/action_view/template/text.rb +0 -30
- data/lib/action_view/template.rb +0 -337
- data/lib/action_view/test_case.rb +0 -245
- data/lib/action_view/testing/resolvers.rb +0 -50
- data/lib/action_view.rb +0 -84
- data/lib/sprockets/assets.rake +0 -99
- data/lib/sprockets/bootstrap.rb +0 -37
- data/lib/sprockets/compressors.rb +0 -83
- data/lib/sprockets/helpers/isolated_helper.rb +0 -13
- data/lib/sprockets/helpers/rails_helper.rb +0 -182
- data/lib/sprockets/helpers.rb +0 -6
- data/lib/sprockets/railtie.rb +0 -62
- data/lib/sprockets/static_compiler.rb +0 -56
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'active_support/core_ext/array/extract_options'
|
|
2
|
+
|
|
1
3
|
module ActionDispatch
|
|
2
4
|
module Routing
|
|
3
5
|
class RoutesProxy #:nodoc:
|
|
@@ -6,8 +8,9 @@ module ActionDispatch
|
|
|
6
8
|
attr_accessor :scope, :routes
|
|
7
9
|
alias :_routes :routes
|
|
8
10
|
|
|
9
|
-
def initialize(routes, scope)
|
|
11
|
+
def initialize(routes, scope, helpers)
|
|
10
12
|
@routes, @scope = routes, scope
|
|
13
|
+
@helpers = helpers
|
|
11
14
|
end
|
|
12
15
|
|
|
13
16
|
def url_options
|
|
@@ -17,16 +20,16 @@ module ActionDispatch
|
|
|
17
20
|
end
|
|
18
21
|
|
|
19
22
|
def respond_to?(method, include_private = false)
|
|
20
|
-
super ||
|
|
23
|
+
super || @helpers.respond_to?(method)
|
|
21
24
|
end
|
|
22
25
|
|
|
23
26
|
def method_missing(method, *args)
|
|
24
|
-
if
|
|
27
|
+
if @helpers.respond_to?(method)
|
|
25
28
|
self.class.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
26
29
|
def #{method}(*args)
|
|
27
30
|
options = args.extract_options!
|
|
28
31
|
args << url_options.merge((options || {}).symbolize_keys)
|
|
29
|
-
|
|
32
|
+
@helpers.#{method}(*args)
|
|
30
33
|
end
|
|
31
34
|
RUBY
|
|
32
35
|
send(method, *args)
|
|
@@ -8,7 +8,8 @@ module ActionDispatch
|
|
|
8
8
|
#
|
|
9
9
|
# <b>Tip:</b> If you need to generate URLs from your models or some other place,
|
|
10
10
|
# then ActionController::UrlFor is what you're looking for. Read on for
|
|
11
|
-
# an introduction.
|
|
11
|
+
# an introduction. In general, this module should not be included on its own,
|
|
12
|
+
# as it is usually included by url_helpers (as in Rails.application.routes.url_helpers).
|
|
12
13
|
#
|
|
13
14
|
# == URL generation from parameters
|
|
14
15
|
#
|
|
@@ -17,9 +18,9 @@ module ActionDispatch
|
|
|
17
18
|
# of parameters. For example, you've probably had the chance to write code
|
|
18
19
|
# like this in one of your views:
|
|
19
20
|
#
|
|
20
|
-
# <%= link_to('Click here', :
|
|
21
|
-
# :
|
|
22
|
-
# # => "/users/new?message=Welcome%21"
|
|
21
|
+
# <%= link_to('Click here', controller: 'users',
|
|
22
|
+
# action: 'new', message: 'Welcome!') %>
|
|
23
|
+
# # => <a href="/users/new?message=Welcome%21">Click here</a>
|
|
23
24
|
#
|
|
24
25
|
# link_to, and all other functions that require URL generation functionality,
|
|
25
26
|
# actually use ActionController::UrlFor under the hood. And in particular,
|
|
@@ -27,22 +28,22 @@ module ActionDispatch
|
|
|
27
28
|
# the same path as the above example by using the following code:
|
|
28
29
|
#
|
|
29
30
|
# include UrlFor
|
|
30
|
-
# url_for(:
|
|
31
|
-
# :
|
|
32
|
-
# :
|
|
33
|
-
# :
|
|
31
|
+
# url_for(controller: 'users',
|
|
32
|
+
# action: 'new',
|
|
33
|
+
# message: 'Welcome!',
|
|
34
|
+
# only_path: true)
|
|
34
35
|
# # => "/users/new?message=Welcome%21"
|
|
35
36
|
#
|
|
36
|
-
# Notice the <tt
|
|
37
|
+
# Notice the <tt>only_path: true</tt> part. This is because UrlFor has no
|
|
37
38
|
# information about the website hostname that your Rails app is serving. So if you
|
|
38
39
|
# want to include the hostname as well, then you must also pass the <tt>:host</tt>
|
|
39
40
|
# argument:
|
|
40
41
|
#
|
|
41
42
|
# include UrlFor
|
|
42
|
-
# url_for(:
|
|
43
|
-
# :
|
|
44
|
-
# :
|
|
45
|
-
# :
|
|
43
|
+
# url_for(controller: 'users',
|
|
44
|
+
# action: 'new',
|
|
45
|
+
# message: 'Welcome!',
|
|
46
|
+
# host: 'www.example.com')
|
|
46
47
|
# # => "http://www.example.com/users/new?message=Welcome%21"
|
|
47
48
|
#
|
|
48
49
|
# By default, all controllers and views have access to a special version of url_for,
|
|
@@ -67,7 +68,7 @@ module ActionDispatch
|
|
|
67
68
|
# This generates, among other things, the method <tt>users_path</tt>. By default,
|
|
68
69
|
# this method is accessible from your controllers, views and mailers. If you need
|
|
69
70
|
# to access this auto-generated method from other places (such as a model), then
|
|
70
|
-
# you can do that by including
|
|
71
|
+
# you can do that by including Rails.application.routes.url_helpers in your class:
|
|
71
72
|
#
|
|
72
73
|
# class User < ActiveRecord::Base
|
|
73
74
|
# include Rails.application.routes.url_helpers
|
|
@@ -84,18 +85,18 @@ module ActionDispatch
|
|
|
84
85
|
include PolymorphicRoutes
|
|
85
86
|
|
|
86
87
|
included do
|
|
87
|
-
# TODO: with_routing extends @controller with url_helpers, trickling down to including this module which overrides its default_url_options
|
|
88
88
|
unless method_defined?(:default_url_options)
|
|
89
89
|
# Including in a class uses an inheritable hash. Modules get a plain hash.
|
|
90
90
|
if respond_to?(:class_attribute)
|
|
91
91
|
class_attribute :default_url_options
|
|
92
92
|
else
|
|
93
|
-
|
|
94
|
-
remove_method :default_url_options
|
|
93
|
+
mattr_writer :default_url_options
|
|
95
94
|
end
|
|
96
95
|
|
|
97
96
|
self.default_url_options = {}
|
|
98
97
|
end
|
|
98
|
+
|
|
99
|
+
include(*_url_for_modules) if respond_to?(:_url_for_modules)
|
|
99
100
|
end
|
|
100
101
|
|
|
101
102
|
def initialize(*)
|
|
@@ -103,6 +104,9 @@ module ActionDispatch
|
|
|
103
104
|
super
|
|
104
105
|
end
|
|
105
106
|
|
|
107
|
+
# Hook overridden in controller to add request information
|
|
108
|
+
# with `default_url_options`. Application logic should not
|
|
109
|
+
# go into url_options.
|
|
106
110
|
def url_options
|
|
107
111
|
default_url_options
|
|
108
112
|
end
|
|
@@ -126,41 +130,66 @@ module ActionDispatch
|
|
|
126
130
|
# * <tt>:port</tt> - Optionally specify the port to connect to.
|
|
127
131
|
# * <tt>:anchor</tt> - An anchor name to be appended to the path.
|
|
128
132
|
# * <tt>:trailing_slash</tt> - If true, adds a trailing slash, as in "/archive/2009/"
|
|
133
|
+
# * <tt>:script_name</tt> - Specifies application path relative to domain root. If provided, prepends application path.
|
|
129
134
|
#
|
|
130
135
|
# Any other key (<tt>:controller</tt>, <tt>:action</tt>, etc.) given to
|
|
131
136
|
# +url_for+ is forwarded to the Routes module.
|
|
132
137
|
#
|
|
133
|
-
#
|
|
134
|
-
#
|
|
135
|
-
# url_for :controller => 'tasks', :action => 'testing', :host => 'somehost.org', :port => '8080'
|
|
138
|
+
# url_for controller: 'tasks', action: 'testing', host: 'somehost.org', port: '8080'
|
|
136
139
|
# # => 'http://somehost.org:8080/tasks/testing'
|
|
137
|
-
# url_for :
|
|
140
|
+
# url_for controller: 'tasks', action: 'testing', host: 'somehost.org', anchor: 'ok', only_path: true
|
|
138
141
|
# # => '/tasks/testing#ok'
|
|
139
|
-
# url_for :
|
|
142
|
+
# url_for controller: 'tasks', action: 'testing', trailing_slash: true
|
|
140
143
|
# # => 'http://somehost.org/tasks/testing/'
|
|
141
|
-
# url_for :
|
|
144
|
+
# url_for controller: 'tasks', action: 'testing', host: 'somehost.org', number: '33'
|
|
142
145
|
# # => 'http://somehost.org/tasks/testing?number=33'
|
|
146
|
+
# url_for controller: 'tasks', action: 'testing', host: 'somehost.org', script_name: "/myapp"
|
|
147
|
+
# # => 'http://somehost.org/myapp/tasks/testing'
|
|
148
|
+
# url_for controller: 'tasks', action: 'testing', host: 'somehost.org', script_name: "/myapp", only_path: true
|
|
149
|
+
# # => '/myapp/tasks/testing'
|
|
143
150
|
def url_for(options = nil)
|
|
144
151
|
case options
|
|
152
|
+
when nil
|
|
153
|
+
_routes.url_for(url_options.symbolize_keys)
|
|
154
|
+
when Hash
|
|
155
|
+
route_name = options.delete :use_route
|
|
156
|
+
_routes.url_for(options.symbolize_keys.reverse_merge!(url_options),
|
|
157
|
+
route_name)
|
|
145
158
|
when String
|
|
146
159
|
options
|
|
147
|
-
when
|
|
148
|
-
|
|
160
|
+
when Symbol
|
|
161
|
+
HelperMethodBuilder.url.handle_string_call self, options
|
|
162
|
+
when Array
|
|
163
|
+
components = options.dup
|
|
164
|
+
polymorphic_url(components, components.extract_options!)
|
|
165
|
+
when Class
|
|
166
|
+
HelperMethodBuilder.url.handle_class_call self, options
|
|
149
167
|
else
|
|
150
|
-
|
|
168
|
+
HelperMethodBuilder.url.handle_model_call self, options
|
|
151
169
|
end
|
|
152
170
|
end
|
|
153
171
|
|
|
154
172
|
protected
|
|
155
|
-
def _with_routes(routes)
|
|
156
|
-
old_routes, @_routes = @_routes, routes
|
|
157
|
-
yield
|
|
158
|
-
ensure
|
|
159
|
-
@_routes = old_routes
|
|
160
|
-
end
|
|
161
173
|
|
|
162
|
-
|
|
163
|
-
|
|
174
|
+
def optimize_routes_generation?
|
|
175
|
+
_routes.optimize_routes_generation? && default_url_options.empty?
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def _with_routes(routes)
|
|
179
|
+
old_routes, @_routes = @_routes, routes
|
|
180
|
+
yield
|
|
181
|
+
ensure
|
|
182
|
+
@_routes = old_routes
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def _routes_context
|
|
186
|
+
self
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
private
|
|
190
|
+
|
|
191
|
+
def _generate_paths_by_default
|
|
192
|
+
true
|
|
164
193
|
end
|
|
165
194
|
end
|
|
166
195
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
1
2
|
require 'active_support/core_ext/object/to_param'
|
|
2
3
|
require 'active_support/core_ext/regexp'
|
|
4
|
+
require 'active_support/dependencies/autoload'
|
|
3
5
|
|
|
4
6
|
module ActionDispatch
|
|
5
7
|
# The routing module provides URL rewriting in native Ruby. It's a way to
|
|
@@ -10,7 +12,7 @@ module ActionDispatch
|
|
|
10
12
|
# Think of creating routes as drawing a map for your requests. The map tells
|
|
11
13
|
# them where to go based on some predefined pattern:
|
|
12
14
|
#
|
|
13
|
-
#
|
|
15
|
+
# Rails.application.routes.draw do
|
|
14
16
|
# Pattern 1 tells some request to go to one place
|
|
15
17
|
# Pattern 2 tell them to go to another
|
|
16
18
|
# ...
|
|
@@ -60,7 +62,7 @@ module ActionDispatch
|
|
|
60
62
|
# directory by using +scope+. +scope+ takes additional options which
|
|
61
63
|
# apply to all enclosed routes.
|
|
62
64
|
#
|
|
63
|
-
# scope :
|
|
65
|
+
# scope path: "/cpanel", as: 'admin' do
|
|
64
66
|
# resources :posts, :comments
|
|
65
67
|
# end
|
|
66
68
|
#
|
|
@@ -68,6 +70,22 @@ module ActionDispatch
|
|
|
68
70
|
# <tt>Routing::Mapper::Scoping#namespace</tt>, and
|
|
69
71
|
# <tt>Routing::Mapper::Scoping#scope</tt>.
|
|
70
72
|
#
|
|
73
|
+
# == Non-resourceful routes
|
|
74
|
+
#
|
|
75
|
+
# For routes that don't fit the <tt>resources</tt> mold, you can use the HTTP helper
|
|
76
|
+
# methods <tt>get</tt>, <tt>post</tt>, <tt>patch</tt>, <tt>put</tt> and <tt>delete</tt>.
|
|
77
|
+
#
|
|
78
|
+
# get 'post/:id' => 'posts#show'
|
|
79
|
+
# post 'post/:id' => 'posts#create_comment'
|
|
80
|
+
#
|
|
81
|
+
# If your route needs to respond to more than one HTTP method (or all methods) then using the
|
|
82
|
+
# <tt>:via</tt> option on <tt>match</tt> is preferable.
|
|
83
|
+
#
|
|
84
|
+
# match 'post/:id' => 'posts#show', via: [:get, :post]
|
|
85
|
+
#
|
|
86
|
+
# Now, if you POST to <tt>/posts/:id</tt>, it will route to the <tt>create_comment</tt> action. A GET on the same
|
|
87
|
+
# URL will route to the <tt>show</tt> action.
|
|
88
|
+
#
|
|
71
89
|
# == Named routes
|
|
72
90
|
#
|
|
73
91
|
# Routes can be named by passing an <tt>:as</tt> option,
|
|
@@ -77,22 +95,22 @@ module ActionDispatch
|
|
|
77
95
|
# Example:
|
|
78
96
|
#
|
|
79
97
|
# # In routes.rb
|
|
80
|
-
#
|
|
98
|
+
# get '/login' => 'accounts#login', as: 'login'
|
|
81
99
|
#
|
|
82
100
|
# # With render, redirect_to, tests, etc.
|
|
83
101
|
# redirect_to login_url
|
|
84
102
|
#
|
|
85
103
|
# Arguments can be passed as well.
|
|
86
104
|
#
|
|
87
|
-
# redirect_to show_item_path(:
|
|
105
|
+
# redirect_to show_item_path(id: 25)
|
|
88
106
|
#
|
|
89
107
|
# Use <tt>root</tt> as a shorthand to name a route for the root path "/".
|
|
90
108
|
#
|
|
91
109
|
# # In routes.rb
|
|
92
|
-
# root :
|
|
110
|
+
# root to: 'blogs#index'
|
|
93
111
|
#
|
|
94
112
|
# # would recognize http://www.example.com/ as
|
|
95
|
-
# params = { :
|
|
113
|
+
# params = { controller: 'blogs', action: 'index' }
|
|
96
114
|
#
|
|
97
115
|
# # and provide these named routes
|
|
98
116
|
# root_url # => 'http://www.example.com/'
|
|
@@ -103,117 +121,70 @@ module ActionDispatch
|
|
|
103
121
|
#
|
|
104
122
|
# # In routes.rb
|
|
105
123
|
# controller :blog do
|
|
106
|
-
#
|
|
107
|
-
#
|
|
108
|
-
#
|
|
124
|
+
# get 'blog/show' => :list
|
|
125
|
+
# get 'blog/delete' => :delete
|
|
126
|
+
# get 'blog/edit/:id' => :edit
|
|
109
127
|
# end
|
|
110
128
|
#
|
|
111
129
|
# # provides named routes for show, delete, and edit
|
|
112
|
-
# link_to @article.title, show_path(:
|
|
130
|
+
# link_to @article.title, show_path(id: @article.id)
|
|
113
131
|
#
|
|
114
132
|
# == Pretty URLs
|
|
115
133
|
#
|
|
116
134
|
# Routes can generate pretty URLs. For example:
|
|
117
135
|
#
|
|
118
|
-
#
|
|
119
|
-
# :
|
|
120
|
-
# :
|
|
121
|
-
# :
|
|
136
|
+
# get '/articles/:year/:month/:day' => 'articles#find_by_id', constraints: {
|
|
137
|
+
# year: /\d{4}/,
|
|
138
|
+
# month: /\d{1,2}/,
|
|
139
|
+
# day: /\d{1,2}/
|
|
122
140
|
# }
|
|
123
141
|
#
|
|
124
142
|
# Using the route above, the URL "http://localhost:3000/articles/2005/11/06"
|
|
125
143
|
# maps to
|
|
126
144
|
#
|
|
127
|
-
# params = {:
|
|
145
|
+
# params = {year: '2005', month: '11', day: '06'}
|
|
128
146
|
#
|
|
129
147
|
# == Regular Expressions and parameters
|
|
130
148
|
# You can specify a regular expression to define a format for a parameter.
|
|
131
149
|
#
|
|
132
150
|
# controller 'geocode' do
|
|
133
|
-
#
|
|
134
|
-
# :
|
|
151
|
+
# get 'geocode/:postalcode' => :show, constraints: {
|
|
152
|
+
# postalcode: /\d{5}(-\d{4})?/
|
|
135
153
|
# }
|
|
136
154
|
#
|
|
137
155
|
# Constraints can include the 'ignorecase' and 'extended syntax' regular
|
|
138
156
|
# expression modifiers:
|
|
139
157
|
#
|
|
140
158
|
# controller 'geocode' do
|
|
141
|
-
#
|
|
142
|
-
# :
|
|
159
|
+
# get 'geocode/:postalcode' => :show, constraints: {
|
|
160
|
+
# postalcode: /hx\d\d\s\d[a-z]{2}/i
|
|
143
161
|
# }
|
|
144
162
|
# end
|
|
145
163
|
#
|
|
146
164
|
# controller 'geocode' do
|
|
147
|
-
#
|
|
148
|
-
# :
|
|
165
|
+
# get 'geocode/:postalcode' => :show, constraints: {
|
|
166
|
+
# postalcode: /# Postcode format
|
|
149
167
|
# \d{5} #Prefix
|
|
150
168
|
# (-\d{4})? #Suffix
|
|
151
169
|
# /x
|
|
152
170
|
# }
|
|
153
171
|
# end
|
|
154
172
|
#
|
|
155
|
-
# Using the multiline
|
|
173
|
+
# Using the multiline modifier will raise an +ArgumentError+.
|
|
156
174
|
# Encoding regular expression modifiers are silently ignored. The
|
|
157
175
|
# match will always use the default encoding or ASCII.
|
|
158
176
|
#
|
|
159
|
-
# ==
|
|
160
|
-
#
|
|
161
|
-
# Consider the following route, which you will find commented out at the
|
|
162
|
-
# bottom of your generated <tt>config/routes.rb</tt>:
|
|
163
|
-
#
|
|
164
|
-
# match ':controller(/:action(/:id))(.:format)'
|
|
165
|
-
#
|
|
166
|
-
# This route states that it expects requests to consist of a
|
|
167
|
-
# <tt>:controller</tt> followed optionally by an <tt>:action</tt> that in
|
|
168
|
-
# turn is followed optionally by an <tt>:id</tt>, which in turn is followed
|
|
169
|
-
# optionally by a <tt>:format</tt>.
|
|
170
|
-
#
|
|
171
|
-
# Suppose you get an incoming request for <tt>/blog/edit/22</tt>, you'll end
|
|
172
|
-
# up with:
|
|
173
|
-
#
|
|
174
|
-
# params = { :controller => 'blog',
|
|
175
|
-
# :action => 'edit',
|
|
176
|
-
# :id => '22'
|
|
177
|
-
# }
|
|
178
|
-
#
|
|
179
|
-
# By not relying on default routes, you improve the security of your
|
|
180
|
-
# application since not all controller actions, which includes actions you
|
|
181
|
-
# might add at a later time, are exposed by default.
|
|
182
|
-
#
|
|
183
|
-
# == HTTP Methods
|
|
184
|
-
#
|
|
185
|
-
# Using the <tt>:via</tt> option when specifying a route allows you to restrict it to a specific HTTP method.
|
|
186
|
-
# Possible values are <tt>:post</tt>, <tt>:get</tt>, <tt>:put</tt>, <tt>:delete</tt> and <tt>:any</tt>.
|
|
187
|
-
# If your route needs to respond to more than one method you can use an array, e.g. <tt>[ :get, :post ]</tt>.
|
|
188
|
-
# The default value is <tt>:any</tt> which means that the route will respond to any of the HTTP methods.
|
|
189
|
-
#
|
|
190
|
-
# Examples:
|
|
191
|
-
#
|
|
192
|
-
# match 'post/:id' => 'posts#show', :via => :get
|
|
193
|
-
# match 'post/:id' => "posts#create_comment', :via => :post
|
|
194
|
-
#
|
|
195
|
-
# Now, if you POST to <tt>/posts/:id</tt>, it will route to the <tt>create_comment</tt> action. A GET on the same
|
|
196
|
-
# URL will route to the <tt>show</tt> action.
|
|
197
|
-
#
|
|
198
|
-
# === HTTP helper methods
|
|
199
|
-
#
|
|
200
|
-
# An alternative method of specifying which HTTP method a route should respond to is to use the helper
|
|
201
|
-
# methods <tt>get</tt>, <tt>post</tt>, <tt>put</tt> and <tt>delete</tt>.
|
|
202
|
-
#
|
|
203
|
-
# Examples:
|
|
177
|
+
# == External redirects
|
|
204
178
|
#
|
|
205
|
-
#
|
|
206
|
-
# post 'post/:id' => "posts#create_comment'
|
|
179
|
+
# You can redirect any path to another path using the redirect helper in your router:
|
|
207
180
|
#
|
|
208
|
-
#
|
|
209
|
-
# however if your route needs to respond to more than one HTTP method (or all methods) then using the
|
|
210
|
-
# <tt>:via</tt> option on <tt>match</tt> is preferable.
|
|
181
|
+
# get "/stories" => redirect("/posts")
|
|
211
182
|
#
|
|
212
|
-
# ==
|
|
183
|
+
# == Unicode character routes
|
|
213
184
|
#
|
|
214
|
-
# You can
|
|
185
|
+
# You can specify unicode character routes in your router:
|
|
215
186
|
#
|
|
216
|
-
#
|
|
187
|
+
# get "こんにちは" => "welcome#index"
|
|
217
188
|
#
|
|
218
189
|
# == Routing to Rack Applications
|
|
219
190
|
#
|
|
@@ -221,7 +192,7 @@ module ActionDispatch
|
|
|
221
192
|
# index action in the PostsController, you can specify any Rack application
|
|
222
193
|
# as the endpoint for a matcher:
|
|
223
194
|
#
|
|
224
|
-
#
|
|
195
|
+
# get "/application.js" => Sprockets
|
|
225
196
|
#
|
|
226
197
|
# == Reloading routes
|
|
227
198
|
#
|
|
@@ -239,7 +210,7 @@ module ActionDispatch
|
|
|
239
210
|
# === +assert_routing+
|
|
240
211
|
#
|
|
241
212
|
# def test_movie_route_properly_splits
|
|
242
|
-
# opts = {:
|
|
213
|
+
# opts = {controller: "plugin", action: "checkout", id: "2"}
|
|
243
214
|
# assert_routing "plugin/checkout/2", opts
|
|
244
215
|
# end
|
|
245
216
|
#
|
|
@@ -248,7 +219,7 @@ module ActionDispatch
|
|
|
248
219
|
# === +assert_recognizes+
|
|
249
220
|
#
|
|
250
221
|
# def test_route_has_options
|
|
251
|
-
# opts = {:
|
|
222
|
+
# opts = {controller: "plugin", action: "show", id: "12"}
|
|
252
223
|
# assert_recognizes opts, "/plugins/show/12"
|
|
253
224
|
# end
|
|
254
225
|
#
|
|
@@ -276,18 +247,15 @@ module ActionDispatch
|
|
|
276
247
|
# Target specific controllers by prefixing the command with <tt>CONTROLLER=x</tt>.
|
|
277
248
|
#
|
|
278
249
|
module Routing
|
|
279
|
-
|
|
280
|
-
autoload :RouteSet, 'action_dispatch/routing/route_set'
|
|
281
|
-
autoload :RoutesProxy, 'action_dispatch/routing/routes_proxy'
|
|
282
|
-
autoload :UrlFor, 'action_dispatch/routing/url_for'
|
|
283
|
-
autoload :PolymorphicRoutes, 'action_dispatch/routing/polymorphic_routes'
|
|
250
|
+
extend ActiveSupport::Autoload
|
|
284
251
|
|
|
285
|
-
|
|
286
|
-
|
|
252
|
+
autoload :Mapper
|
|
253
|
+
autoload :RouteSet
|
|
254
|
+
autoload :RoutesProxy
|
|
255
|
+
autoload :UrlFor
|
|
256
|
+
autoload :PolymorphicRoutes
|
|
287
257
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
include PolymorphicRoutes
|
|
291
|
-
end
|
|
258
|
+
SEPARATORS = %w( / . ? ) #:nodoc:
|
|
259
|
+
HTTP_METHODS = [:get, :head, :post, :patch, :put, :delete, :options] #:nodoc:
|
|
292
260
|
end
|
|
293
261
|
end
|
|
@@ -1,37 +1,3 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'active_support/deprecation'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
module Assertions
|
|
5
|
-
module DomAssertions
|
|
6
|
-
# \Test two HTML strings for equivalency (e.g., identical up to reordering of attributes)
|
|
7
|
-
#
|
|
8
|
-
# ==== Examples
|
|
9
|
-
#
|
|
10
|
-
# # assert that the referenced method generates the appropriate HTML string
|
|
11
|
-
# assert_dom_equal '<a href="http://www.example.com">Apples</a>', link_to("Apples", "http://www.example.com")
|
|
12
|
-
#
|
|
13
|
-
def assert_dom_equal(expected, actual, message = "")
|
|
14
|
-
expected_dom = HTML::Document.new(expected).root
|
|
15
|
-
actual_dom = HTML::Document.new(actual).root
|
|
16
|
-
full_message = build_message(message, "<?> expected to be == to\n<?>.", expected_dom.to_s, actual_dom.to_s)
|
|
17
|
-
|
|
18
|
-
assert_block(full_message) { expected_dom == actual_dom }
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# The negated form of +assert_dom_equivalent+.
|
|
22
|
-
#
|
|
23
|
-
# ==== Examples
|
|
24
|
-
#
|
|
25
|
-
# # assert that the referenced method does not generate the specified HTML string
|
|
26
|
-
# assert_dom_not_equal '<a href="http://www.example.com">Apples</a>', link_to("Oranges", "http://www.example.com")
|
|
27
|
-
#
|
|
28
|
-
def assert_dom_not_equal(expected, actual, message = "")
|
|
29
|
-
expected_dom = HTML::Document.new(expected).root
|
|
30
|
-
actual_dom = HTML::Document.new(actual).root
|
|
31
|
-
full_message = build_message(message, "<?> expected to be != to\n<?>.", expected_dom.to_s, actual_dom.to_s)
|
|
32
|
-
|
|
33
|
-
assert_block(full_message) { expected_dom != actual_dom }
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
3
|
+
ActiveSupport::Deprecation.warn("ActionDispatch::Assertions::DomAssertions has been extracted to the rails-dom-testing gem.")
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
require 'active_support/core_ext/object/inclusion'
|
|
2
1
|
|
|
3
2
|
module ActionDispatch
|
|
4
3
|
module Assertions
|
|
5
4
|
# A small suite of assertions that test responses from \Rails applications.
|
|
6
5
|
module ResponseAssertions
|
|
7
|
-
extend ActiveSupport::Concern
|
|
8
|
-
|
|
9
6
|
# Asserts that the response is one of the following types:
|
|
10
7
|
#
|
|
11
|
-
# * <tt>:success</tt> - Status code was 200
|
|
8
|
+
# * <tt>:success</tt> - Status code was in the 200-299 range
|
|
12
9
|
# * <tt>:redirect</tt> - Status code was in the 300-399 range
|
|
13
10
|
# * <tt>:missing</tt> - Status code was 404
|
|
14
11
|
# * <tt>:error</tt> - Status code was in the 500-599 range
|
|
@@ -17,36 +14,35 @@ module ActionDispatch
|
|
|
17
14
|
# or its symbolic equivalent <tt>assert_response(:not_implemented)</tt>.
|
|
18
15
|
# See Rack::Utils::SYMBOL_TO_STATUS_CODE for a full list.
|
|
19
16
|
#
|
|
20
|
-
# ==== Examples
|
|
21
|
-
#
|
|
22
17
|
# # assert that the response was a redirection
|
|
23
18
|
# assert_response :redirect
|
|
24
19
|
#
|
|
25
20
|
# # assert that the response code was status code 401 (unauthorized)
|
|
26
21
|
# assert_response 401
|
|
27
|
-
#
|
|
28
22
|
def assert_response(type, message = nil)
|
|
29
|
-
|
|
23
|
+
message ||= "Expected response to be a <#{type}>, but was <#{@response.response_code}>"
|
|
30
24
|
|
|
31
|
-
if
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
25
|
+
if Symbol === type
|
|
26
|
+
if [:success, :missing, :redirect, :error].include?(type)
|
|
27
|
+
assert @response.send("#{type}?"), message
|
|
28
|
+
else
|
|
29
|
+
code = Rack::Utils::SYMBOL_TO_STATUS_CODE[type]
|
|
30
|
+
if code.nil?
|
|
31
|
+
raise ArgumentError, "Invalid response type :#{type}"
|
|
32
|
+
end
|
|
33
|
+
assert_equal code, @response.response_code, message
|
|
34
|
+
end
|
|
37
35
|
else
|
|
38
|
-
|
|
36
|
+
assert_equal type, @response.response_code, message
|
|
39
37
|
end
|
|
40
38
|
end
|
|
41
39
|
|
|
42
40
|
# Assert that the redirection options passed in match those of the redirect called in the latest action.
|
|
43
|
-
# This match can be partial, such that <tt>assert_redirected_to(:
|
|
44
|
-
# match the redirection of <tt>redirect_to(:
|
|
45
|
-
#
|
|
46
|
-
# ==== Examples
|
|
41
|
+
# This match can be partial, such that <tt>assert_redirected_to(controller: "weblog")</tt> will also
|
|
42
|
+
# match the redirection of <tt>redirect_to(controller: "weblog", action: "show")</tt> and so on.
|
|
47
43
|
#
|
|
48
44
|
# # assert that the redirection was to the "index" action on the WeblogController
|
|
49
|
-
# assert_redirected_to :
|
|
45
|
+
# assert_redirected_to controller: "weblog", action: "index"
|
|
50
46
|
#
|
|
51
47
|
# # assert that the redirection was to the named route login_url
|
|
52
48
|
# assert_redirected_to login_url
|
|
@@ -54,16 +50,17 @@ module ActionDispatch
|
|
|
54
50
|
# # assert that the redirection was to the url for @customer
|
|
55
51
|
# assert_redirected_to @customer
|
|
56
52
|
#
|
|
53
|
+
# # asserts that the redirection matches the regular expression
|
|
54
|
+
# assert_redirected_to %r(\Ahttp://example.org)
|
|
57
55
|
def assert_redirected_to(options = {}, message=nil)
|
|
58
56
|
assert_response(:redirect, message)
|
|
59
|
-
return true if options
|
|
57
|
+
return true if options === @response.location
|
|
60
58
|
|
|
61
59
|
redirect_is = normalize_argument_to_redirection(@response.location)
|
|
62
60
|
redirect_expected = normalize_argument_to_redirection(options)
|
|
63
61
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
end
|
|
62
|
+
message ||= "Expected response to be a redirect to <#{redirect_expected}> but was a redirect to <#{redirect_is}>"
|
|
63
|
+
assert_operator redirect_expected, :===, redirect_is, message
|
|
67
64
|
end
|
|
68
65
|
|
|
69
66
|
private
|
|
@@ -73,22 +70,11 @@ module ActionDispatch
|
|
|
73
70
|
end
|
|
74
71
|
|
|
75
72
|
def normalize_argument_to_redirection(fragment)
|
|
76
|
-
|
|
77
|
-
when %r{^\w[A-Za-z\d+.-]*:.*}
|
|
73
|
+
if Regexp === fragment
|
|
78
74
|
fragment
|
|
79
|
-
when String
|
|
80
|
-
@request.protocol + @request.host_with_port + fragment
|
|
81
|
-
when :back
|
|
82
|
-
raise RedirectBackError unless refer = @request.headers["Referer"]
|
|
83
|
-
refer
|
|
84
75
|
else
|
|
85
|
-
@controller
|
|
86
|
-
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def validate_request!
|
|
90
|
-
unless @request.is_a?(ActionDispatch::Request)
|
|
91
|
-
raise ArgumentError, "@request must be an ActionDispatch::Request"
|
|
76
|
+
handle = @controller || ActionController::Redirecting
|
|
77
|
+
handle._compute_redirect_to_location(@request, fragment)
|
|
92
78
|
end
|
|
93
79
|
end
|
|
94
80
|
end
|