actionpack 3.2.19 → 4.0.0
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 +850 -401
- data/MIT-LICENSE +1 -1
- data/README.rdoc +5 -288
- data/lib/abstract_controller/asset_paths.rb +2 -2
- data/lib/abstract_controller/base.rb +39 -37
- data/lib/abstract_controller/callbacks.rb +101 -82
- data/lib/abstract_controller/collector.rb +7 -3
- data/lib/abstract_controller/helpers.rb +25 -13
- data/lib/abstract_controller/layouts.rb +74 -74
- data/lib/abstract_controller/logger.rb +1 -2
- data/lib/abstract_controller/rendering.rb +30 -13
- data/lib/abstract_controller/translation.rb +16 -1
- data/lib/abstract_controller/url_for.rb +6 -6
- data/lib/abstract_controller/view_paths.rb +1 -1
- data/lib/abstract_controller.rb +1 -8
- data/lib/action_controller/base.rb +46 -22
- data/lib/action_controller/caching/fragments.rb +23 -53
- data/lib/action_controller/caching.rb +46 -33
- data/lib/action_controller/deprecated/integration_test.rb +3 -0
- data/lib/action_controller/deprecated.rb +5 -1
- data/lib/action_controller/log_subscriber.rb +16 -8
- data/lib/action_controller/metal/conditional_get.rb +76 -32
- data/lib/action_controller/metal/data_streaming.rb +20 -26
- data/lib/action_controller/metal/exceptions.rb +19 -6
- data/lib/action_controller/metal/flash.rb +24 -9
- data/lib/action_controller/metal/force_ssl.rb +70 -12
- data/lib/action_controller/metal/head.rb +25 -4
- data/lib/action_controller/metal/helpers.rb +5 -9
- data/lib/action_controller/metal/hide_actions.rb +0 -1
- data/lib/action_controller/metal/http_authentication.rb +107 -83
- data/lib/action_controller/metal/implicit_render.rb +1 -1
- data/lib/action_controller/metal/instrumentation.rb +2 -1
- data/lib/action_controller/metal/live.rb +175 -0
- data/lib/action_controller/metal/mime_responds.rb +161 -47
- data/lib/action_controller/metal/params_wrapper.rb +112 -74
- data/lib/action_controller/metal/rack_delegation.rb +9 -3
- data/lib/action_controller/metal/redirecting.rb +15 -20
- data/lib/action_controller/metal/renderers.rb +11 -9
- data/lib/action_controller/metal/rendering.rb +9 -1
- data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
- data/lib/action_controller/metal/responder.rb +20 -19
- data/lib/action_controller/metal/streaming.rb +12 -18
- data/lib/action_controller/metal/strong_parameters.rb +520 -0
- data/lib/action_controller/metal/testing.rb +13 -18
- data/lib/action_controller/metal/url_for.rb +28 -25
- data/lib/action_controller/metal.rb +17 -32
- data/lib/action_controller/model_naming.rb +12 -0
- data/lib/action_controller/railtie.rb +33 -17
- data/lib/action_controller/railties/helpers.rb +22 -0
- data/lib/action_controller/record_identifier.rb +18 -72
- data/lib/action_controller/test_case.rb +251 -131
- data/lib/action_controller/vendor/html-scanner.rb +4 -19
- data/lib/action_controller.rb +15 -6
- data/lib/action_dispatch/http/cache.rb +63 -11
- data/lib/action_dispatch/http/filter_parameters.rb +18 -8
- data/lib/action_dispatch/http/filter_redirect.rb +37 -0
- data/lib/action_dispatch/http/headers.rb +49 -17
- data/lib/action_dispatch/http/mime_negotiation.rb +24 -1
- data/lib/action_dispatch/http/mime_type.rb +154 -100
- data/lib/action_dispatch/http/mime_types.rb +1 -1
- data/lib/action_dispatch/http/parameter_filter.rb +44 -46
- data/lib/action_dispatch/http/parameters.rb +28 -28
- data/lib/action_dispatch/http/rack_cache.rb +2 -3
- data/lib/action_dispatch/http/request.rb +64 -18
- data/lib/action_dispatch/http/response.rb +130 -35
- data/lib/action_dispatch/http/upload.rb +63 -20
- data/lib/action_dispatch/http/url.rb +98 -35
- data/lib/action_dispatch/journey/backwards.rb +5 -0
- data/lib/action_dispatch/journey/formatter.rb +146 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -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 +124 -0
- data/lib/action_dispatch/journey/parser.rb +206 -0
- data/lib/action_dispatch/journey/parser.y +47 -0
- data/lib/action_dispatch/journey/parser_extras.rb +23 -0
- data/lib/action_dispatch/journey/path/pattern.rb +196 -0
- data/lib/action_dispatch/journey/route.rb +124 -0
- data/lib/action_dispatch/journey/router/strexp.rb +24 -0
- data/lib/action_dispatch/journey/router/utils.rb +54 -0
- data/lib/action_dispatch/journey/router.rb +166 -0
- data/lib/action_dispatch/journey/routes.rb +75 -0
- data/lib/action_dispatch/journey/scanner.rb +61 -0
- data/lib/action_dispatch/journey/visitors.rb +197 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +34 -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 +9 -4
- data/lib/action_dispatch/middleware/cookies.rb +259 -114
- data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
- data/lib/action_dispatch/middleware/exception_wrapper.rb +29 -3
- data/lib/action_dispatch/middleware/flash.rb +58 -58
- data/lib/action_dispatch/middleware/params_parser.rb +14 -29
- data/lib/action_dispatch/middleware/public_exceptions.rb +30 -14
- data/lib/action_dispatch/middleware/reloader.rb +6 -6
- data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
- data/lib/action_dispatch/middleware/request_id.rb +2 -6
- data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
- data/lib/action_dispatch/middleware/session/cookie_store.rb +82 -28
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
- data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
- data/lib/action_dispatch/middleware/ssl.rb +70 -0
- data/lib/action_dispatch/middleware/stack.rb +6 -1
- data/lib/action_dispatch/middleware/static.rb +2 -1
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
- data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +7 -9
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +127 -5
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
- data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
- data/lib/action_dispatch/railtie.rb +16 -6
- data/lib/action_dispatch/request/session.rb +181 -0
- data/lib/action_dispatch/routing/inspector.rb +240 -0
- data/lib/action_dispatch/routing/mapper.rb +540 -291
- data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
- data/lib/action_dispatch/routing/redirection.rb +46 -29
- data/lib/action_dispatch/routing/route_set.rb +207 -164
- data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
- data/lib/action_dispatch/routing/url_for.rb +48 -33
- data/lib/action_dispatch/routing.rb +48 -83
- data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
- data/lib/action_dispatch/testing/assertions/response.rb +32 -40
- data/lib/action_dispatch/testing/assertions/routing.rb +42 -41
- data/lib/action_dispatch/testing/assertions/selector.rb +17 -22
- data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
- data/lib/action_dispatch/testing/integration.rb +65 -51
- data/lib/action_dispatch/testing/test_process.rb +9 -6
- data/lib/action_dispatch/testing/test_request.rb +7 -3
- data/lib/action_dispatch.rb +21 -15
- data/lib/action_pack/version.rb +7 -6
- data/lib/action_pack.rb +1 -1
- data/lib/action_view/base.rb +15 -34
- data/lib/action_view/buffers.rb +7 -1
- data/lib/action_view/context.rb +4 -4
- data/lib/action_view/dependency_tracker.rb +93 -0
- data/lib/action_view/digestor.rb +85 -0
- data/lib/action_view/flows.rb +1 -4
- data/lib/action_view/helpers/active_model_helper.rb +3 -4
- data/lib/action_view/helpers/asset_tag_helper.rb +215 -352
- data/lib/action_view/helpers/asset_url_helper.rb +355 -0
- data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
- data/lib/action_view/helpers/cache_helper.rb +150 -18
- data/lib/action_view/helpers/capture_helper.rb +44 -31
- data/lib/action_view/helpers/csrf_helper.rb +0 -2
- data/lib/action_view/helpers/date_helper.rb +269 -248
- data/lib/action_view/helpers/debug_helper.rb +10 -11
- data/lib/action_view/helpers/form_helper.rb +931 -537
- data/lib/action_view/helpers/form_options_helper.rb +341 -166
- data/lib/action_view/helpers/form_tag_helper.rb +190 -90
- data/lib/action_view/helpers/javascript_helper.rb +23 -16
- data/lib/action_view/helpers/number_helper.rb +148 -329
- data/lib/action_view/helpers/output_safety_helper.rb +3 -3
- data/lib/action_view/helpers/record_tag_helper.rb +17 -22
- data/lib/action_view/helpers/rendering_helper.rb +2 -2
- data/lib/action_view/helpers/sanitize_helper.rb +3 -6
- data/lib/action_view/helpers/tag_helper.rb +46 -33
- data/lib/action_view/helpers/tags/base.rb +147 -0
- data/lib/action_view/helpers/tags/check_box.rb +64 -0
- data/lib/action_view/helpers/tags/checkable.rb +16 -0
- data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
- data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
- data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
- data/lib/action_view/helpers/tags/collection_select.rb +28 -0
- data/lib/action_view/helpers/tags/color_field.rb +25 -0
- data/lib/action_view/helpers/tags/date_field.rb +13 -0
- data/lib/action_view/helpers/tags/date_select.rb +72 -0
- data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
- data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
- data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
- data/lib/action_view/helpers/tags/email_field.rb +8 -0
- data/lib/action_view/helpers/tags/file_field.rb +8 -0
- data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
- data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
- data/lib/action_view/helpers/tags/label.rb +65 -0
- data/lib/action_view/helpers/tags/month_field.rb +13 -0
- data/lib/action_view/helpers/tags/number_field.rb +18 -0
- data/lib/action_view/helpers/tags/password_field.rb +12 -0
- data/lib/action_view/helpers/tags/radio_button.rb +31 -0
- data/lib/action_view/helpers/tags/range_field.rb +8 -0
- data/lib/action_view/helpers/tags/search_field.rb +24 -0
- data/lib/action_view/helpers/tags/select.rb +40 -0
- data/lib/action_view/helpers/tags/tel_field.rb +8 -0
- data/lib/action_view/helpers/tags/text_area.rb +18 -0
- data/lib/action_view/helpers/tags/text_field.rb +29 -0
- data/lib/action_view/helpers/tags/time_field.rb +13 -0
- data/lib/action_view/helpers/tags/time_select.rb +8 -0
- data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
- data/lib/action_view/helpers/tags/url_field.rb +8 -0
- data/lib/action_view/helpers/tags/week_field.rb +13 -0
- data/lib/action_view/helpers/tags.rb +39 -0
- data/lib/action_view/helpers/text_helper.rb +130 -114
- data/lib/action_view/helpers/translation_helper.rb +32 -16
- data/lib/action_view/helpers/url_helper.rb +211 -270
- data/lib/action_view/helpers.rb +2 -4
- data/lib/action_view/locale/en.yml +1 -105
- data/lib/action_view/log_subscriber.rb +6 -4
- data/lib/action_view/lookup_context.rb +15 -28
- data/lib/action_view/model_naming.rb +12 -0
- data/lib/action_view/path_set.rb +8 -20
- data/lib/action_view/railtie.rb +6 -22
- data/lib/action_view/record_identifier.rb +84 -0
- data/lib/action_view/renderer/abstract_renderer.rb +25 -19
- data/lib/action_view/renderer/partial_renderer.rb +158 -81
- data/lib/action_view/renderer/renderer.rb +8 -12
- data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
- data/lib/action_view/renderer/template_renderer.rb +12 -10
- data/lib/action_view/routing_url_for.rb +107 -0
- data/lib/action_view/template/error.rb +22 -12
- data/lib/action_view/template/handlers/builder.rb +1 -1
- data/lib/action_view/template/handlers/erb.rb +40 -19
- data/lib/action_view/template/handlers/raw.rb +11 -0
- data/lib/action_view/template/handlers.rb +12 -9
- data/lib/action_view/template/resolver.rb +107 -53
- data/lib/action_view/template/text.rb +12 -8
- data/lib/action_view/template/types.rb +57 -0
- data/lib/action_view/template.rb +25 -23
- data/lib/action_view/test_case.rb +67 -42
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +13 -2
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +9 -9
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
- data/lib/action_view/vendor/html-scanner.rb +20 -0
- data/lib/action_view.rb +17 -8
- metadata +184 -214
- 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/performance_test.rb +0 -1
- data/lib/action_controller/metal/compatibility.rb +0 -65
- data/lib/action_controller/metal/session_management.rb +0 -14
- data/lib/action_controller/railties/paths.rb +0 -25
- 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/testing/performance_test.rb +0 -10
- data/lib/action_view/asset_paths.rb +0 -142
- data/lib/action_view/helpers/asset_paths.rb +0 -7
- 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/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 'action_controller/model_naming'
|
|
2
|
+
|
|
1
3
|
module ActionDispatch
|
|
2
4
|
module Routing
|
|
3
5
|
# Polymorphic URL helpers are methods for smart resolution to a named route call when
|
|
@@ -32,7 +34,7 @@ module ActionDispatch
|
|
|
32
34
|
# == Prefixed polymorphic helpers
|
|
33
35
|
#
|
|
34
36
|
# In addition to <tt>polymorphic_url</tt> and <tt>polymorphic_path</tt> methods, a
|
|
35
|
-
# number of prefixed helpers are available as a shorthand to <tt
|
|
37
|
+
# number of prefixed helpers are available as a shorthand to <tt>action: "..."</tt>
|
|
36
38
|
# in options. Those are:
|
|
37
39
|
#
|
|
38
40
|
# * <tt>edit_polymorphic_url</tt>, <tt>edit_polymorphic_path</tt>
|
|
@@ -41,20 +43,20 @@ module ActionDispatch
|
|
|
41
43
|
# Example usage:
|
|
42
44
|
#
|
|
43
45
|
# edit_polymorphic_path(@post) # => "/posts/1/edit"
|
|
44
|
-
# polymorphic_path(@post, :
|
|
45
|
-
#
|
|
46
|
-
# == Using with mounted engines
|
|
46
|
+
# polymorphic_path(@post, format: :pdf) # => "/posts/1.pdf"
|
|
47
47
|
#
|
|
48
|
-
#
|
|
49
|
-
# polymorphic_url pointing at engine's routes. To do that, just pass proxy used
|
|
50
|
-
# to reach engine's routes as a first argument:
|
|
48
|
+
# == Usage with mounted engines
|
|
51
49
|
#
|
|
52
|
-
#
|
|
50
|
+
# If you are using a mounted engine and you need to use a polymorphic_url
|
|
51
|
+
# pointing at the engine's routes, pass in the engine's route proxy as the first
|
|
52
|
+
# argument to the method. For example:
|
|
53
53
|
#
|
|
54
|
-
#
|
|
55
|
-
#
|
|
54
|
+
# polymorphic_url([blog, @post]) # calls blog.post_path(@post)
|
|
55
|
+
# form_for([blog, @post]) # => "/blog/posts/1"
|
|
56
56
|
#
|
|
57
57
|
module PolymorphicRoutes
|
|
58
|
+
include ActionController::ModelNaming
|
|
59
|
+
|
|
58
60
|
# Constructs a call to a named RESTful route for the given record and returns the
|
|
59
61
|
# resulting URL string. For example:
|
|
60
62
|
#
|
|
@@ -72,8 +74,6 @@ module ActionDispatch
|
|
|
72
74
|
# * <tt>:routing_type</tt> - Allowed values are <tt>:path</tt> or <tt>:url</tt>.
|
|
73
75
|
# Default is <tt>:url</tt>.
|
|
74
76
|
#
|
|
75
|
-
# ==== Examples
|
|
76
|
-
#
|
|
77
77
|
# # an Article record
|
|
78
78
|
# polymorphic_url(record) # same as article_url(record)
|
|
79
79
|
#
|
|
@@ -130,7 +130,7 @@ module ActionDispatch
|
|
|
130
130
|
end
|
|
131
131
|
|
|
132
132
|
# Returns the path component of a URL for the given record. It uses
|
|
133
|
-
# <tt>polymorphic_url</tt> with <tt
|
|
133
|
+
# <tt>polymorphic_url</tt> with <tt>routing_type: :path</tt>.
|
|
134
134
|
def polymorphic_path(record_or_hash_or_array, options = {})
|
|
135
135
|
polymorphic_url(record_or_hash_or_array, options.merge(:routing_type => :path))
|
|
136
136
|
end
|
|
@@ -156,10 +156,6 @@ module ActionDispatch
|
|
|
156
156
|
options[:action] ? "#{options[:action]}_" : ''
|
|
157
157
|
end
|
|
158
158
|
|
|
159
|
-
def convert_to_model(object)
|
|
160
|
-
object.respond_to?(:to_model) ? object.to_model : object
|
|
161
|
-
end
|
|
162
|
-
|
|
163
159
|
def routing_type(options)
|
|
164
160
|
options[:routing_type] || :url
|
|
165
161
|
end
|
|
@@ -171,7 +167,7 @@ module ActionDispatch
|
|
|
171
167
|
if parent.is_a?(Symbol) || parent.is_a?(String)
|
|
172
168
|
parent
|
|
173
169
|
else
|
|
174
|
-
|
|
170
|
+
model_name_from_record_or_class(parent).singular_route_key
|
|
175
171
|
end
|
|
176
172
|
end
|
|
177
173
|
else
|
|
@@ -183,9 +179,9 @@ module ActionDispatch
|
|
|
183
179
|
route << record
|
|
184
180
|
elsif record
|
|
185
181
|
if inflection == :singular
|
|
186
|
-
route <<
|
|
182
|
+
route << model_name_from_record_or_class(record).singular_route_key
|
|
187
183
|
else
|
|
188
|
-
route <<
|
|
184
|
+
route << model_name_from_record_or_class(record).route_key
|
|
189
185
|
end
|
|
190
186
|
else
|
|
191
187
|
raise ArgumentError, "Nil location provided. Can't build URI."
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
require 'action_dispatch/http/request'
|
|
2
2
|
require 'active_support/core_ext/uri'
|
|
3
|
+
require 'active_support/core_ext/array/extract_options'
|
|
3
4
|
require 'rack/utils'
|
|
5
|
+
require 'action_controller/metal/exceptions'
|
|
4
6
|
|
|
5
7
|
module ActionDispatch
|
|
6
8
|
module Routing
|
|
@@ -15,6 +17,14 @@ module ActionDispatch
|
|
|
15
17
|
def call(env)
|
|
16
18
|
req = Request.new(env)
|
|
17
19
|
|
|
20
|
+
# If any of the path parameters has a invalid encoding then
|
|
21
|
+
# raise since it's likely to trigger errors further on.
|
|
22
|
+
req.symbolized_path_parameters.each do |key, value|
|
|
23
|
+
unless value.valid_encoding?
|
|
24
|
+
raise ActionController::BadRequest, "Invalid parameter: #{key} => #{value}"
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
18
28
|
uri = URI.parse(path(req.symbolized_path_parameters, req))
|
|
19
29
|
uri.scheme ||= req.scheme
|
|
20
30
|
uri.host ||= req.host
|
|
@@ -34,6 +44,25 @@ module ActionDispatch
|
|
|
34
44
|
def path(params, request)
|
|
35
45
|
block.call params, request
|
|
36
46
|
end
|
|
47
|
+
|
|
48
|
+
def inspect
|
|
49
|
+
"redirect(#{status})"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class PathRedirect < Redirect
|
|
54
|
+
def path(params, request)
|
|
55
|
+
(params.empty? || !block.match(/%\{\w*\}/)) ? block : (block % escape(params))
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def inspect
|
|
59
|
+
"redirect(#{status}, #{block})"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
def escape(params)
|
|
64
|
+
Hash[params.map{ |k,v| [k, Rack::Utils.escape(v)] }]
|
|
65
|
+
end
|
|
37
66
|
end
|
|
38
67
|
|
|
39
68
|
class OptionRedirect < Redirect # :nodoc:
|
|
@@ -46,7 +75,7 @@ module ActionDispatch
|
|
|
46
75
|
:port => request.optional_port,
|
|
47
76
|
:path => request.path,
|
|
48
77
|
:params => request.query_parameters
|
|
49
|
-
}.merge options
|
|
78
|
+
}.merge! options
|
|
50
79
|
|
|
51
80
|
if !params.empty? && url_options[:path].match(/%\{\w*\}/)
|
|
52
81
|
url_options[:path] = (url_options[:path] % escape_path(params))
|
|
@@ -55,6 +84,10 @@ module ActionDispatch
|
|
|
55
84
|
ActionDispatch::Http::URL.url_for url_options
|
|
56
85
|
end
|
|
57
86
|
|
|
87
|
+
def inspect
|
|
88
|
+
"redirect(#{status}, #{options.map{ |k,v| "#{k}: #{v}" }.join(', ')})"
|
|
89
|
+
end
|
|
90
|
+
|
|
58
91
|
private
|
|
59
92
|
def escape_path(params)
|
|
60
93
|
Hash[params.map{ |k,v| [k, URI.parser.escape(v)] }]
|
|
@@ -65,11 +98,11 @@ module ActionDispatch
|
|
|
65
98
|
|
|
66
99
|
# Redirect any path to another path:
|
|
67
100
|
#
|
|
68
|
-
#
|
|
101
|
+
# get "/stories" => redirect("/posts")
|
|
69
102
|
#
|
|
70
103
|
# You can also use interpolation in the supplied redirect argument:
|
|
71
104
|
#
|
|
72
|
-
#
|
|
105
|
+
# get 'docs/:article', to: redirect('/wiki/%{article}')
|
|
73
106
|
#
|
|
74
107
|
# Alternatively you can use one of the other syntaxes:
|
|
75
108
|
#
|
|
@@ -78,54 +111,38 @@ module ActionDispatch
|
|
|
78
111
|
# params, depending of how many arguments your block accepts. A string is required as a
|
|
79
112
|
# return value.
|
|
80
113
|
#
|
|
81
|
-
#
|
|
114
|
+
# get 'jokes/:number', to: redirect { |params, request|
|
|
82
115
|
# path = (params[:number].to_i.even? ? "wheres-the-beef" : "i-love-lamp")
|
|
83
116
|
# "http://#{request.host_with_port}/#{path}"
|
|
84
117
|
# }
|
|
85
118
|
#
|
|
119
|
+
# Note that the +do end+ syntax for the redirect block wouldn't work, as Ruby would pass
|
|
120
|
+
# the block to +get+ instead of +redirect+. Use <tt>{ ... }</tt> instead.
|
|
121
|
+
#
|
|
86
122
|
# The options version of redirect allows you to supply only the parts of the url which need
|
|
87
123
|
# to change, it also supports interpolation of the path similar to the first example.
|
|
88
124
|
#
|
|
89
|
-
#
|
|
90
|
-
#
|
|
125
|
+
# get 'stores/:name', to: redirect(subdomain: 'stores', path: '/%{name}')
|
|
126
|
+
# get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}')
|
|
91
127
|
#
|
|
92
128
|
# Finally, an object which responds to call can be supplied to redirect, allowing you to reuse
|
|
93
129
|
# common redirect routes. The call method must accept two arguments, params and request, and return
|
|
94
130
|
# a string.
|
|
95
131
|
#
|
|
96
|
-
#
|
|
132
|
+
# get 'accounts/:name' => redirect(SubdomainRedirector.new('api'))
|
|
97
133
|
#
|
|
98
134
|
def redirect(*args, &block)
|
|
99
|
-
options = args.
|
|
135
|
+
options = args.extract_options!
|
|
100
136
|
status = options.delete(:status) || 301
|
|
137
|
+
path = args.shift
|
|
101
138
|
|
|
102
139
|
return OptionRedirect.new(status, options) if options.any?
|
|
103
|
-
|
|
104
|
-
path = args.shift
|
|
105
|
-
|
|
106
|
-
block = lambda { |params, request|
|
|
107
|
-
(params.empty? || !path.match(/%\{\w*\}/)) ? path : (path % escape(params))
|
|
108
|
-
} if String === path
|
|
140
|
+
return PathRedirect.new(status, path) if String === path
|
|
109
141
|
|
|
110
142
|
block = path if path.respond_to? :call
|
|
111
|
-
|
|
112
|
-
# :FIXME: remove in Rails 4.0
|
|
113
|
-
if block && block.respond_to?(:arity) && block.arity < 2
|
|
114
|
-
msg = "redirect blocks with arity of #{block.arity} are deprecated. Your block must take 2 parameters: the environment, and a request object"
|
|
115
|
-
ActiveSupport::Deprecation.warn msg
|
|
116
|
-
deprecated_block = block
|
|
117
|
-
block = lambda { |params, _| deprecated_block.call(params) }
|
|
118
|
-
end
|
|
119
|
-
|
|
120
143
|
raise ArgumentError, "redirection argument not supported" unless block
|
|
121
|
-
|
|
122
144
|
Redirect.new status, block
|
|
123
145
|
end
|
|
124
|
-
|
|
125
|
-
private
|
|
126
|
-
def escape(params)
|
|
127
|
-
Hash[params.map{ |k,v| [k, Rack::Utils.escape(v)] }]
|
|
128
|
-
end
|
|
129
146
|
end
|
|
130
147
|
end
|
|
131
148
|
end
|