actionpack 4.2.11.3 → 5.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of actionpack might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +379 -462
- data/MIT-LICENSE +1 -1
- data/README.rdoc +2 -3
- data/lib/abstract_controller.rb +0 -2
- data/lib/abstract_controller/base.rb +17 -32
- data/lib/abstract_controller/callbacks.rb +52 -19
- data/lib/abstract_controller/collector.rb +4 -9
- data/lib/abstract_controller/helpers.rb +2 -2
- data/lib/abstract_controller/railties/routes_helpers.rb +2 -2
- data/lib/abstract_controller/rendering.rb +27 -22
- data/lib/abstract_controller/translation.rb +8 -7
- data/lib/action_controller.rb +4 -3
- data/lib/action_controller/api.rb +146 -0
- data/lib/action_controller/base.rb +6 -10
- data/lib/action_controller/caching.rb +1 -3
- data/lib/action_controller/caching/fragments.rb +48 -3
- data/lib/action_controller/form_builder.rb +48 -0
- data/lib/action_controller/log_subscriber.rb +1 -10
- data/lib/action_controller/metal.rb +89 -62
- data/lib/action_controller/metal/basic_implicit_render.rb +11 -0
- data/lib/action_controller/metal/conditional_get.rb +65 -24
- data/lib/action_controller/metal/cookies.rb +0 -2
- data/lib/action_controller/metal/data_streaming.rb +2 -22
- data/lib/action_controller/metal/etag_with_template_digest.rb +1 -1
- data/lib/action_controller/metal/exceptions.rb +11 -6
- data/lib/action_controller/metal/force_ssl.rb +6 -6
- data/lib/action_controller/metal/head.rb +14 -7
- data/lib/action_controller/metal/helpers.rb +9 -5
- data/lib/action_controller/metal/http_authentication.rb +37 -38
- data/lib/action_controller/metal/implicit_render.rb +23 -6
- data/lib/action_controller/metal/instrumentation.rb +0 -1
- data/lib/action_controller/metal/live.rb +17 -55
- data/lib/action_controller/metal/mime_responds.rb +17 -37
- data/lib/action_controller/metal/params_wrapper.rb +8 -8
- data/lib/action_controller/metal/redirecting.rb +32 -9
- data/lib/action_controller/metal/renderers.rb +10 -8
- data/lib/action_controller/metal/rendering.rb +38 -6
- data/lib/action_controller/metal/request_forgery_protection.rb +67 -35
- data/lib/action_controller/metal/rescue.rb +2 -4
- data/lib/action_controller/metal/streaming.rb +4 -4
- data/lib/action_controller/metal/strong_parameters.rb +231 -78
- data/lib/action_controller/metal/testing.rb +1 -12
- data/lib/action_controller/metal/url_for.rb +12 -5
- data/lib/action_controller/renderer.rb +111 -0
- data/lib/action_controller/template_assertions.rb +9 -0
- data/lib/action_controller/test_case.rb +267 -363
- data/lib/action_dispatch.rb +2 -1
- data/lib/action_dispatch/http/cache.rb +23 -26
- data/lib/action_dispatch/http/filter_parameters.rb +6 -8
- data/lib/action_dispatch/http/filter_redirect.rb +7 -8
- data/lib/action_dispatch/http/headers.rb +28 -11
- data/lib/action_dispatch/http/mime_negotiation.rb +40 -26
- data/lib/action_dispatch/http/mime_type.rb +92 -61
- data/lib/action_dispatch/http/mime_types.rb +1 -4
- data/lib/action_dispatch/http/parameter_filter.rb +18 -8
- data/lib/action_dispatch/http/parameters.rb +45 -41
- data/lib/action_dispatch/http/request.rb +146 -82
- data/lib/action_dispatch/http/response.rb +180 -99
- data/lib/action_dispatch/http/url.rb +117 -8
- data/lib/action_dispatch/journey/formatter.rb +34 -28
- data/lib/action_dispatch/journey/gtg/transition_table.rb +1 -1
- data/lib/action_dispatch/journey/nfa/dot.rb +0 -2
- data/lib/action_dispatch/journey/nfa/transition_table.rb +1 -46
- data/lib/action_dispatch/journey/nodes/node.rb +14 -4
- data/lib/action_dispatch/journey/parser_extras.rb +4 -0
- data/lib/action_dispatch/journey/path/pattern.rb +37 -41
- data/lib/action_dispatch/journey/route.rb +71 -17
- data/lib/action_dispatch/journey/router.rb +5 -6
- data/lib/action_dispatch/journey/router/utils.rb +5 -5
- data/lib/action_dispatch/journey/routes.rb +14 -15
- data/lib/action_dispatch/journey/visitors.rb +86 -43
- data/lib/action_dispatch/middleware/cookies.rb +184 -135
- data/lib/action_dispatch/middleware/debug_exceptions.rb +115 -45
- data/lib/action_dispatch/middleware/exception_wrapper.rb +21 -20
- data/lib/action_dispatch/middleware/flash.rb +61 -45
- data/lib/action_dispatch/middleware/load_interlock.rb +21 -0
- data/lib/action_dispatch/middleware/params_parser.rb +30 -46
- data/lib/action_dispatch/middleware/public_exceptions.rb +2 -2
- data/lib/action_dispatch/middleware/reloader.rb +2 -4
- data/lib/action_dispatch/middleware/remote_ip.rb +29 -19
- data/lib/action_dispatch/middleware/request_id.rb +11 -6
- data/lib/action_dispatch/middleware/session/abstract_store.rb +23 -11
- data/lib/action_dispatch/middleware/session/cache_store.rb +9 -6
- data/lib/action_dispatch/middleware/session/cookie_store.rb +29 -23
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +4 -0
- data/lib/action_dispatch/middleware/show_exceptions.rb +11 -9
- data/lib/action_dispatch/middleware/ssl.rb +93 -36
- data/lib/action_dispatch/middleware/stack.rb +43 -48
- data/lib/action_dispatch/middleware/static.rb +52 -40
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +2 -14
- data/lib/action_dispatch/middleware/templates/rescues/{_source.erb → _source.html.erb} +0 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +1 -1
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +1 -1
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +4 -4
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +59 -63
- data/lib/action_dispatch/railtie.rb +0 -2
- data/lib/action_dispatch/request/session.rb +66 -34
- data/lib/action_dispatch/request/utils.rb +51 -19
- data/lib/action_dispatch/routing.rb +3 -8
- data/lib/action_dispatch/routing/inspector.rb +6 -30
- data/lib/action_dispatch/routing/mapper.rb +447 -322
- data/lib/action_dispatch/routing/polymorphic_routes.rb +8 -14
- data/lib/action_dispatch/routing/redirection.rb +3 -3
- data/lib/action_dispatch/routing/route_set.rb +124 -227
- data/lib/action_dispatch/routing/url_for.rb +27 -10
- data/lib/action_dispatch/testing/assertions.rb +1 -1
- data/lib/action_dispatch/testing/assertions/response.rb +27 -9
- data/lib/action_dispatch/testing/assertions/routing.rb +9 -9
- data/lib/action_dispatch/testing/integration.rb +237 -76
- data/lib/action_dispatch/testing/test_process.rb +5 -5
- data/lib/action_dispatch/testing/test_request.rb +12 -21
- data/lib/action_dispatch/testing/test_response.rb +1 -4
- data/lib/action_pack.rb +1 -1
- data/lib/action_pack/gem_version.rb +4 -4
- metadata +26 -25
- data/lib/action_controller/metal/hide_actions.rb +0 -40
- data/lib/action_controller/metal/rack_delegation.rb +0 -32
- data/lib/action_controller/middleware.rb +0 -39
- data/lib/action_controller/model_naming.rb +0 -12
- data/lib/action_dispatch/journey/router/strexp.rb +0 -27
- data/lib/action_dispatch/testing/assertions/dom.rb +0 -3
- data/lib/action_dispatch/testing/assertions/selector.rb +0 -3
- data/lib/action_dispatch/testing/assertions/tag.rb +0 -3
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'action_controller/model_naming'
|
2
|
-
|
3
1
|
module ActionDispatch
|
4
2
|
module Routing
|
5
3
|
# Polymorphic URL helpers are methods for smart resolution to a named route call when
|
@@ -55,8 +53,6 @@ module ActionDispatch
|
|
55
53
|
# form_for([blog, @post]) # => "/blog/posts/1"
|
56
54
|
#
|
57
55
|
module PolymorphicRoutes
|
58
|
-
include ActionController::ModelNaming
|
59
|
-
|
60
56
|
# Constructs a call to a named RESTful route for the given record and returns the
|
61
57
|
# resulting URL string. For example:
|
62
58
|
#
|
@@ -251,14 +247,12 @@ module ActionDispatch
|
|
251
247
|
args = []
|
252
248
|
|
253
249
|
model = record.to_model
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
named_route = prefix + "#{name}_#{suffix}"
|
250
|
+
named_route = if model.persisted?
|
251
|
+
args << model
|
252
|
+
get_method_for_string model.model_name.singular_route_key
|
253
|
+
else
|
254
|
+
get_method_for_class model
|
255
|
+
end
|
262
256
|
|
263
257
|
[named_route, args]
|
264
258
|
end
|
@@ -313,11 +307,11 @@ module ActionDispatch
|
|
313
307
|
|
314
308
|
def get_method_for_class(klass)
|
315
309
|
name = @key_strategy.call klass.model_name
|
316
|
-
|
310
|
+
get_method_for_string name
|
317
311
|
end
|
318
312
|
|
319
313
|
def get_method_for_string(str)
|
320
|
-
|
314
|
+
"#{prefix}#{str}_#{suffix}"
|
321
315
|
end
|
322
316
|
|
323
317
|
[nil, 'new', 'edit'].each do |action|
|
@@ -24,7 +24,7 @@ module ActionDispatch
|
|
24
24
|
def serve(req)
|
25
25
|
req.check_path_parameters!
|
26
26
|
uri = URI.parse(path(req.path_parameters, req))
|
27
|
-
|
27
|
+
|
28
28
|
unless uri.host
|
29
29
|
if relative_path?(uri.path)
|
30
30
|
uri.path = "#{req.script_name}/#{uri.path}"
|
@@ -32,7 +32,7 @@ module ActionDispatch
|
|
32
32
|
uri.path = req.script_name.empty? ? "/" : req.script_name
|
33
33
|
end
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
uri.scheme ||= req.scheme
|
37
37
|
uri.host ||= req.host
|
38
38
|
uri.port ||= req.port unless req.standard_port?
|
@@ -124,7 +124,7 @@ module ActionDispatch
|
|
124
124
|
url_options[:script_name] = request.script_name
|
125
125
|
end
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
ActionDispatch::Http::URL.url_for url_options
|
129
129
|
end
|
130
130
|
|
@@ -1,11 +1,9 @@
|
|
1
1
|
require 'action_dispatch/journey'
|
2
|
-
require 'forwardable'
|
3
2
|
require 'active_support/concern'
|
4
3
|
require 'active_support/core_ext/object/to_query'
|
5
4
|
require 'active_support/core_ext/hash/slice'
|
6
5
|
require 'active_support/core_ext/module/remove_method'
|
7
6
|
require 'active_support/core_ext/array/extract_options'
|
8
|
-
require 'active_support/core_ext/string/filters'
|
9
7
|
require 'action_controller/metal/exceptions'
|
10
8
|
require 'action_dispatch/http/request'
|
11
9
|
require 'action_dispatch/routing/endpoint'
|
@@ -20,67 +18,48 @@ module ActionDispatch
|
|
20
18
|
# alias inspect to to_s.
|
21
19
|
alias inspect to_s
|
22
20
|
|
23
|
-
mattr_accessor :relative_url_root
|
24
|
-
|
25
21
|
class Dispatcher < Routing::Endpoint
|
26
|
-
def initialize(
|
27
|
-
@
|
22
|
+
def initialize(raise_on_name_error)
|
23
|
+
@raise_on_name_error = raise_on_name_error
|
28
24
|
end
|
29
25
|
|
30
26
|
def dispatcher?; true; end
|
31
27
|
|
32
28
|
def serve(req)
|
33
|
-
req.
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
29
|
+
params = req.path_parameters
|
30
|
+
controller = controller req
|
31
|
+
res = controller.make_response! req
|
32
|
+
dispatch(controller, params[:action], req, res)
|
33
|
+
rescue ActionController::RoutingError
|
34
|
+
if @raise_on_name_error
|
35
|
+
raise
|
36
|
+
else
|
40
37
|
return [404, {'X-Cascade' => 'pass'}, []]
|
41
38
|
end
|
42
|
-
|
43
|
-
dispatch(controller, params[:action], req.env)
|
44
39
|
end
|
45
40
|
|
46
|
-
|
47
|
-
normalize_controller!(params)
|
48
|
-
merge_default_action!(params)
|
49
|
-
end
|
41
|
+
private
|
50
42
|
|
51
|
-
|
52
|
-
|
53
|
-
# a user error. However, if the controller was retrieved through a dynamic
|
54
|
-
# segment, as in :controller(/:action), we should simply return nil and
|
55
|
-
# delegate the control back to Rack cascade. Besides, if this is not a default
|
56
|
-
# controller, it means we should respect the @scope[:module] parameter.
|
57
|
-
def controller(params, default_controller=true)
|
58
|
-
if params && params.key?(:controller)
|
59
|
-
controller_param = params[:controller]
|
60
|
-
controller_reference(controller_param)
|
61
|
-
end
|
43
|
+
def controller(req)
|
44
|
+
req.controller_class
|
62
45
|
rescue NameError => e
|
63
|
-
raise ActionController::RoutingError, e.message, e.backtrace
|
46
|
+
raise ActionController::RoutingError, e.message, e.backtrace
|
64
47
|
end
|
65
48
|
|
66
|
-
|
67
|
-
|
68
|
-
def controller_reference(controller_param)
|
69
|
-
const_name = "#{controller_param.camelize}Controller"
|
70
|
-
ActiveSupport::Dependencies.constantize(const_name)
|
49
|
+
def dispatch(controller, action, req, res)
|
50
|
+
controller.dispatch(action, req, res)
|
71
51
|
end
|
52
|
+
end
|
72
53
|
|
73
|
-
|
74
|
-
|
54
|
+
class StaticDispatcher < Dispatcher
|
55
|
+
def initialize(controller_class)
|
56
|
+
super(false)
|
57
|
+
@controller_class = controller_class
|
75
58
|
end
|
76
59
|
|
77
|
-
|
78
|
-
params[:controller] = params[:controller].underscore if params.key?(:controller)
|
79
|
-
end
|
60
|
+
private
|
80
61
|
|
81
|
-
def
|
82
|
-
params[:action] ||= 'index'
|
83
|
-
end
|
62
|
+
def controller(_); @controller_class; end
|
84
63
|
end
|
85
64
|
|
86
65
|
# A NamedRouteCollection instance is a collection of named routes, and also
|
@@ -88,7 +67,8 @@ module ActionDispatch
|
|
88
67
|
# named routes.
|
89
68
|
class NamedRouteCollection
|
90
69
|
include Enumerable
|
91
|
-
attr_reader :routes, :url_helpers_module
|
70
|
+
attr_reader :routes, :url_helpers_module, :path_helpers_module
|
71
|
+
private :routes
|
92
72
|
|
93
73
|
def initialize
|
94
74
|
@routes = {}
|
@@ -103,14 +83,6 @@ module ActionDispatch
|
|
103
83
|
@path_helpers.include?(key) || @url_helpers.include?(key)
|
104
84
|
end
|
105
85
|
|
106
|
-
def helpers
|
107
|
-
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
108
|
-
`named_routes.helpers` is deprecated, please use `route_defined?(route_name)`
|
109
|
-
to see if a named route was defined.
|
110
|
-
MSG
|
111
|
-
@path_helpers + @url_helpers
|
112
|
-
end
|
113
|
-
|
114
86
|
def helper_names
|
115
87
|
@path_helpers.map(&:to_s) + @url_helpers.map(&:to_s)
|
116
88
|
end
|
@@ -139,7 +111,7 @@ module ActionDispatch
|
|
139
111
|
@url_helpers_module.send :undef_method, url_name
|
140
112
|
end
|
141
113
|
routes[key] = route
|
142
|
-
define_url_helper @path_helpers_module, route, path_name, route.defaults, name,
|
114
|
+
define_url_helper @path_helpers_module, route, path_name, route.defaults, name, PATH
|
143
115
|
define_url_helper @url_helpers_module, route, url_name, route.defaults, name, UNKNOWN
|
144
116
|
|
145
117
|
@path_helpers << path_name
|
@@ -151,6 +123,7 @@ module ActionDispatch
|
|
151
123
|
end
|
152
124
|
|
153
125
|
def key?(name)
|
126
|
+
return unless name
|
154
127
|
routes.key? name.to_sym
|
155
128
|
end
|
156
129
|
|
@@ -171,25 +144,6 @@ module ActionDispatch
|
|
171
144
|
routes.length
|
172
145
|
end
|
173
146
|
|
174
|
-
def path_helpers_module(warn = false)
|
175
|
-
if warn
|
176
|
-
mod = @path_helpers_module
|
177
|
-
helpers = @path_helpers
|
178
|
-
Module.new do
|
179
|
-
include mod
|
180
|
-
|
181
|
-
helpers.each do |meth|
|
182
|
-
define_method(meth) do |*args, &block|
|
183
|
-
ActiveSupport::Deprecation.warn("The method `#{meth}` cannot be used here as a full URL is required. Use `#{meth.to_s.sub(/_path$/, '_url')}` instead")
|
184
|
-
super(*args, &block)
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
else
|
189
|
-
@path_helpers_module
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
147
|
class UrlHelper
|
194
148
|
def self.create(route, options, route_name, url_strategy)
|
195
149
|
if optimize_helper?(route)
|
@@ -227,11 +181,8 @@ module ActionDispatch
|
|
227
181
|
private
|
228
182
|
|
229
183
|
def optimized_helper(args)
|
230
|
-
params = parameterize_args(args)
|
231
|
-
|
232
|
-
|
233
|
-
unless missing_keys.empty?
|
234
|
-
raise_generation_error(params, missing_keys)
|
184
|
+
params = parameterize_args(args) do
|
185
|
+
raise_generation_error(args)
|
235
186
|
end
|
236
187
|
|
237
188
|
@route.format params
|
@@ -243,16 +194,21 @@ module ActionDispatch
|
|
243
194
|
|
244
195
|
def parameterize_args(args)
|
245
196
|
params = {}
|
246
|
-
@
|
197
|
+
@arg_size.times { |i|
|
198
|
+
key = @required_parts[i]
|
199
|
+
value = args[i].to_param
|
200
|
+
yield key if value.nil? || value.empty?
|
201
|
+
params[key] = value
|
202
|
+
}
|
247
203
|
params
|
248
204
|
end
|
249
205
|
|
250
|
-
def
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
constraints = Hash[@route.requirements.merge(
|
206
|
+
def raise_generation_error(args)
|
207
|
+
missing_keys = []
|
208
|
+
params = parameterize_args(args) { |missing_key|
|
209
|
+
missing_keys << missing_key
|
210
|
+
}
|
211
|
+
constraints = Hash[@route.requirements.merge(params).sort_by{|k,v| k.to_s}]
|
256
212
|
message = "No route matches #{constraints.inspect}"
|
257
213
|
message << " missing required keys: #{missing_keys.sort.inspect}"
|
258
214
|
|
@@ -272,7 +228,7 @@ module ActionDispatch
|
|
272
228
|
controller_options = t.url_options
|
273
229
|
options = controller_options.merge @options
|
274
230
|
hash = handle_positional_args(controller_options,
|
275
|
-
|
231
|
+
inner_options || {},
|
276
232
|
args,
|
277
233
|
options,
|
278
234
|
@segment_keys)
|
@@ -293,33 +249,18 @@ module ActionDispatch
|
|
293
249
|
path_params -= controller_options.keys
|
294
250
|
path_params -= result.keys
|
295
251
|
end
|
296
|
-
|
297
|
-
|
252
|
+
inner_options.each_key do |key|
|
253
|
+
path_params.delete(key)
|
254
|
+
end
|
298
255
|
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
256
|
+
args.each_with_index do |arg, index|
|
257
|
+
param = path_params[index]
|
258
|
+
result[param] = arg if param
|
259
|
+
end
|
303
260
|
end
|
304
261
|
|
305
262
|
result.merge!(inner_options)
|
306
263
|
end
|
307
|
-
|
308
|
-
DEPRECATED_STRING_OPTIONS = %w[controller action]
|
309
|
-
|
310
|
-
def deprecate_string_options(options)
|
311
|
-
options ||= {}
|
312
|
-
deprecated_string_options = options.keys & DEPRECATED_STRING_OPTIONS
|
313
|
-
if deprecated_string_options.any?
|
314
|
-
msg = "Calling URL helpers with string keys #{deprecated_string_options.join(", ")} is deprecated. Use symbols instead."
|
315
|
-
ActiveSupport::Deprecation.warn(msg)
|
316
|
-
deprecated_string_options.each do |option|
|
317
|
-
value = options.delete(option)
|
318
|
-
options[option.to_sym] = value
|
319
|
-
end
|
320
|
-
end
|
321
|
-
options
|
322
|
-
end
|
323
264
|
end
|
324
265
|
|
325
266
|
private
|
@@ -350,38 +291,12 @@ module ActionDispatch
|
|
350
291
|
|
351
292
|
# strategy for building urls to send to the client
|
352
293
|
PATH = ->(options) { ActionDispatch::Http::URL.path_for(options) }
|
353
|
-
FULL = ->(options) { ActionDispatch::Http::URL.full_url_for(options) }
|
354
294
|
UNKNOWN = ->(options) { ActionDispatch::Http::URL.url_for(options) }
|
355
|
-
LEGACY = ->(options) {
|
356
|
-
if options.key?(:only_path)
|
357
|
-
if options[:only_path]
|
358
|
-
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
359
|
-
You are calling a `*_path` helper with the `only_path` option
|
360
|
-
explicitly set to `true`. This option will stop working on
|
361
|
-
path helpers in Rails 5. Simply remove the `only_path: true`
|
362
|
-
argument from your call as it is redundant when applied to a
|
363
|
-
path helper.
|
364
|
-
MSG
|
365
|
-
|
366
|
-
PATH.call(options)
|
367
|
-
else
|
368
|
-
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
369
|
-
You are calling a `*_path` helper with the `only_path` option
|
370
|
-
explicitly set to `false`. This option will stop working on
|
371
|
-
path helpers in Rails 5. Use the corresponding `*_url` helper
|
372
|
-
instead.
|
373
|
-
MSG
|
374
|
-
|
375
|
-
FULL.call(options)
|
376
|
-
end
|
377
|
-
else
|
378
|
-
PATH.call(options)
|
379
|
-
end
|
380
|
-
}
|
381
295
|
|
382
296
|
attr_accessor :formatter, :set, :named_routes, :default_scope, :router
|
383
297
|
attr_accessor :disable_clear_and_finalize, :resources_path_names
|
384
|
-
attr_accessor :default_url_options
|
298
|
+
attr_accessor :default_url_options
|
299
|
+
attr_reader :env_key
|
385
300
|
|
386
301
|
alias :routes :set
|
387
302
|
|
@@ -389,21 +304,58 @@ module ActionDispatch
|
|
389
304
|
{ :new => 'new', :edit => 'edit' }
|
390
305
|
end
|
391
306
|
|
392
|
-
def
|
307
|
+
def self.new_with_config(config)
|
308
|
+
route_set_config = DEFAULT_CONFIG
|
309
|
+
|
310
|
+
# engines apparently don't have this set
|
311
|
+
if config.respond_to? :relative_url_root
|
312
|
+
route_set_config.relative_url_root = config.relative_url_root
|
313
|
+
end
|
314
|
+
|
315
|
+
if config.respond_to? :api_only
|
316
|
+
route_set_config.api_only = config.api_only
|
317
|
+
end
|
318
|
+
|
319
|
+
new route_set_config
|
320
|
+
end
|
321
|
+
|
322
|
+
Config = Struct.new :relative_url_root, :api_only
|
323
|
+
|
324
|
+
DEFAULT_CONFIG = Config.new(nil, false)
|
325
|
+
|
326
|
+
def initialize(config = DEFAULT_CONFIG)
|
393
327
|
self.named_routes = NamedRouteCollection.new
|
394
328
|
self.resources_path_names = self.class.default_resources_path_names
|
395
329
|
self.default_url_options = {}
|
396
|
-
self.request_class = request_class
|
397
330
|
|
331
|
+
@config = config
|
398
332
|
@append = []
|
399
333
|
@prepend = []
|
400
334
|
@disable_clear_and_finalize = false
|
401
335
|
@finalized = false
|
336
|
+
@env_key = "ROUTES_#{object_id}_SCRIPT_NAME".freeze
|
402
337
|
|
403
338
|
@set = Journey::Routes.new
|
404
339
|
@router = Journey::Router.new @set
|
405
|
-
@formatter = Journey::Formatter.new
|
340
|
+
@formatter = Journey::Formatter.new self
|
341
|
+
end
|
342
|
+
|
343
|
+
def relative_url_root
|
344
|
+
@config.relative_url_root
|
345
|
+
end
|
346
|
+
|
347
|
+
def api_only?
|
348
|
+
@config.api_only
|
349
|
+
end
|
350
|
+
|
351
|
+
def request_class
|
352
|
+
ActionDispatch::Request
|
353
|
+
end
|
354
|
+
|
355
|
+
def make_request(env)
|
356
|
+
request_class.new env
|
406
357
|
end
|
358
|
+
private :make_request
|
407
359
|
|
408
360
|
def draw(&block)
|
409
361
|
clear! unless @disable_clear_and_finalize
|
@@ -421,10 +373,6 @@ module ActionDispatch
|
|
421
373
|
end
|
422
374
|
|
423
375
|
def eval_block(block)
|
424
|
-
if block.arity == 1
|
425
|
-
raise "You are using the old router DSL which has been removed in Rails 3.1. " <<
|
426
|
-
"Please check how to update your routes file at: http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/"
|
427
|
-
end
|
428
376
|
mapper = Mapper.new(self)
|
429
377
|
if default_scope
|
430
378
|
mapper.with_default_scope(default_scope, &block)
|
@@ -448,10 +396,6 @@ module ActionDispatch
|
|
448
396
|
@prepend.each { |blk| eval_block(blk) }
|
449
397
|
end
|
450
398
|
|
451
|
-
def dispatcher(defaults)
|
452
|
-
Routing::RouteSet::Dispatcher.new(defaults)
|
453
|
-
end
|
454
|
-
|
455
399
|
module MountedHelpers
|
456
400
|
extend ActiveSupport::Concern
|
457
401
|
include UrlFor
|
@@ -495,7 +439,14 @@ module ActionDispatch
|
|
495
439
|
# Rails.application.routes.url_helpers.url_for(args)
|
496
440
|
@_routes = routes
|
497
441
|
class << self
|
498
|
-
|
442
|
+
def url_for(options)
|
443
|
+
@_routes.url_for(options)
|
444
|
+
end
|
445
|
+
|
446
|
+
def optimize_routes_generation?
|
447
|
+
@_routes.optimize_routes_generation?
|
448
|
+
end
|
449
|
+
|
499
450
|
attr_reader :_routes
|
500
451
|
def url_options; {}; end
|
501
452
|
end
|
@@ -513,12 +464,10 @@ module ActionDispatch
|
|
513
464
|
|
514
465
|
if supports_path
|
515
466
|
path_helpers = routes.named_routes.path_helpers_module
|
516
|
-
else
|
517
|
-
path_helpers = routes.named_routes.path_helpers_module(true)
|
518
|
-
end
|
519
467
|
|
520
|
-
|
521
|
-
|
468
|
+
include path_helpers
|
469
|
+
extend path_helpers
|
470
|
+
end
|
522
471
|
|
523
472
|
# plus a singleton class method called _routes ...
|
524
473
|
included do
|
@@ -542,7 +491,7 @@ module ActionDispatch
|
|
542
491
|
routes.empty?
|
543
492
|
end
|
544
493
|
|
545
|
-
def add_route(
|
494
|
+
def add_route(mapping, path_ast, name, anchor)
|
546
495
|
raise ArgumentError, "Invalid route name: '#{name}'" unless name.blank? || name.to_s.match(/^[_a-z]\w*$/i)
|
547
496
|
|
548
497
|
if name && named_routes[name]
|
@@ -553,74 +502,17 @@ module ActionDispatch
|
|
553
502
|
"http://guides.rubyonrails.org/routing.html#restricting-the-routes-created"
|
554
503
|
end
|
555
504
|
|
556
|
-
|
557
|
-
ast = conditions.delete :parsed_path_info
|
558
|
-
path = build_path(path, ast, requirements, anchor)
|
559
|
-
conditions = build_conditions(conditions, path.names.map { |x| x.to_sym })
|
560
|
-
|
561
|
-
route = @set.add_route(app, path, conditions, defaults, name)
|
505
|
+
route = @set.add_route(name, mapping)
|
562
506
|
named_routes[name] = route if name
|
563
507
|
route
|
564
508
|
end
|
565
509
|
|
566
|
-
def build_path(path, ast, requirements, anchor)
|
567
|
-
strexp = Journey::Router::Strexp.new(
|
568
|
-
ast,
|
569
|
-
path,
|
570
|
-
requirements,
|
571
|
-
SEPARATORS,
|
572
|
-
anchor)
|
573
|
-
|
574
|
-
pattern = Journey::Path::Pattern.new(strexp)
|
575
|
-
|
576
|
-
builder = Journey::GTG::Builder.new pattern.spec
|
577
|
-
|
578
|
-
# Get all the symbol nodes followed by literals that are not the
|
579
|
-
# dummy node.
|
580
|
-
symbols = pattern.spec.grep(Journey::Nodes::Symbol).find_all { |n|
|
581
|
-
builder.followpos(n).first.literal?
|
582
|
-
}
|
583
|
-
|
584
|
-
# Get all the symbol nodes preceded by literals.
|
585
|
-
symbols.concat pattern.spec.find_all(&:literal?).map { |n|
|
586
|
-
builder.followpos(n).first
|
587
|
-
}.find_all(&:symbol?)
|
588
|
-
|
589
|
-
symbols.each { |x|
|
590
|
-
x.regexp = /(?:#{Regexp.union(x.regexp, '-')})+/
|
591
|
-
}
|
592
|
-
|
593
|
-
pattern
|
594
|
-
end
|
595
|
-
private :build_path
|
596
|
-
|
597
|
-
def build_conditions(current_conditions, path_values)
|
598
|
-
conditions = current_conditions.dup
|
599
|
-
|
600
|
-
# Rack-Mount requires that :request_method be a regular expression.
|
601
|
-
# :request_method represents the HTTP verb that matches this route.
|
602
|
-
#
|
603
|
-
# Here we munge values before they get sent on to rack-mount.
|
604
|
-
verbs = conditions[:request_method] || []
|
605
|
-
unless verbs.empty?
|
606
|
-
conditions[:request_method] = %r[^#{verbs.join('|')}$]
|
607
|
-
end
|
608
|
-
|
609
|
-
conditions.keep_if do |k, _|
|
610
|
-
k == :action || k == :controller || k == :required_defaults ||
|
611
|
-
@request_class.public_method_defined?(k) || path_values.include?(k)
|
612
|
-
end
|
613
|
-
end
|
614
|
-
private :build_conditions
|
615
|
-
|
616
510
|
class Generator
|
617
511
|
PARAMETERIZE = lambda do |name, value|
|
618
512
|
if name == :controller
|
619
513
|
value
|
620
|
-
|
621
|
-
value.
|
622
|
-
elsif param = value.to_param
|
623
|
-
param
|
514
|
+
else
|
515
|
+
value.to_param
|
624
516
|
end
|
625
517
|
end
|
626
518
|
|
@@ -628,8 +520,8 @@ module ActionDispatch
|
|
628
520
|
|
629
521
|
def initialize(named_route, options, recall, set)
|
630
522
|
@named_route = named_route
|
631
|
-
@options = options
|
632
|
-
@recall = recall
|
523
|
+
@options = options
|
524
|
+
@recall = recall
|
633
525
|
@set = set
|
634
526
|
|
635
527
|
normalize_recall!
|
@@ -651,7 +543,7 @@ module ActionDispatch
|
|
651
543
|
def use_recall_for(key)
|
652
544
|
if @recall[key] && (!@options.key?(key) || @options[key] == @recall[key])
|
653
545
|
if !named_route_exists? || segment_keys.include?(key)
|
654
|
-
@options[key] = @recall
|
546
|
+
@options[key] = @recall[key]
|
655
547
|
end
|
656
548
|
end
|
657
549
|
end
|
@@ -705,12 +597,18 @@ module ActionDispatch
|
|
705
597
|
|
706
598
|
# Remove leading slashes from controllers
|
707
599
|
def normalize_controller!
|
708
|
-
|
600
|
+
if controller
|
601
|
+
if controller.start_with?("/".freeze)
|
602
|
+
@options[:controller] = controller[1..-1]
|
603
|
+
else
|
604
|
+
@options[:controller] = controller
|
605
|
+
end
|
606
|
+
end
|
709
607
|
end
|
710
608
|
|
711
609
|
# Move 'index' action from options to recall
|
712
610
|
def normalize_action!
|
713
|
-
if @options[:action] == 'index'
|
611
|
+
if @options[:action] == 'index'.freeze
|
714
612
|
@recall[:action] = @options.delete(:action)
|
715
613
|
end
|
716
614
|
end
|
@@ -812,7 +710,7 @@ module ActionDispatch
|
|
812
710
|
end
|
813
711
|
|
814
712
|
def call(env)
|
815
|
-
req =
|
713
|
+
req = make_request(env)
|
816
714
|
req.path_info = Journey::Router::Utils.normalize_path(req.path_info)
|
817
715
|
@router.serve(req)
|
818
716
|
end
|
@@ -828,7 +726,7 @@ module ActionDispatch
|
|
828
726
|
raise ActionController::RoutingError, e.message
|
829
727
|
end
|
830
728
|
|
831
|
-
req =
|
729
|
+
req = make_request(env)
|
832
730
|
@router.recognize(req) do |route, params|
|
833
731
|
params.merge!(extras)
|
834
732
|
params.each do |key, value|
|
@@ -841,14 +739,13 @@ module ActionDispatch
|
|
841
739
|
req.path_parameters = old_params.merge params
|
842
740
|
app = route.app
|
843
741
|
if app.matches?(req) && app.dispatcher?
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
dispatcher.prepare_params!(params)
|
848
|
-
return params
|
849
|
-
else
|
742
|
+
begin
|
743
|
+
req.controller_class
|
744
|
+
rescue NameError
|
850
745
|
raise ActionController::RoutingError, "A route matches #{path.inspect}, but references missing controller: #{params[:controller].camelize}Controller"
|
851
746
|
end
|
747
|
+
|
748
|
+
return req.path_parameters
|
852
749
|
end
|
853
750
|
end
|
854
751
|
|