1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Cache url_helpers

`url_helpers` used to be memoized. This was lost in a refactoring and
this PR adds it back. We noticed this while investigating why
integration tests are slower than controller tests.
This commit is contained in:
eileencodes 2015-02-01 14:30:59 -08:00
parent e6d8f435a9
commit 3b637802b2

View file

@ -410,61 +410,63 @@ module ActionDispatch
end end
def url_helpers(supports_path = true) def url_helpers(supports_path = true)
routes = self @url_helpers ||= begin
routes = self
Module.new do Module.new do
extend ActiveSupport::Concern extend ActiveSupport::Concern
include UrlFor include UrlFor
# Define url_for in the singleton level so one can do: # Define url_for in the singleton level so one can do:
# Rails.application.routes.url_helpers.url_for(args) # Rails.application.routes.url_helpers.url_for(args)
@_routes = routes @_routes = routes
class << self class << self
def url_for(options) def url_for(options)
@_routes.url_for(options) @_routes.url_for(options)
end
def optimize_routes_generation?
@_routes.optimize_routes_generation?
end
attr_reader :_routes
def url_options; {}; end
end end
def optimize_routes_generation? url_helpers = routes.named_routes.url_helpers_module
@_routes.optimize_routes_generation?
# Make named_routes available in the module singleton
# as well, so one can do:
# Rails.application.routes.url_helpers.posts_path
extend url_helpers
# Any class that includes this module will get all
# named routes...
include url_helpers
if supports_path
path_helpers = routes.named_routes.path_helpers_module
include path_helpers
extend path_helpers
end end
attr_reader :_routes # plus a singleton class method called _routes ...
def url_options; {}; end included do
singleton_class.send(:redefine_method, :_routes) { routes }
end
# And an instance method _routes. Note that
# UrlFor (included in this module) add extra
# conveniences for working with @_routes.
define_method(:_routes) { @_routes || routes }
define_method(:_generate_paths_by_default) do
supports_path
end
private :_generate_paths_by_default
end end
url_helpers = routes.named_routes.url_helpers_module
# Make named_routes available in the module singleton
# as well, so one can do:
# Rails.application.routes.url_helpers.posts_path
extend url_helpers
# Any class that includes this module will get all
# named routes...
include url_helpers
if supports_path
path_helpers = routes.named_routes.path_helpers_module
include path_helpers
extend path_helpers
end
# plus a singleton class method called _routes ...
included do
singleton_class.send(:redefine_method, :_routes) { routes }
end
# And an instance method _routes. Note that
# UrlFor (included in this module) add extra
# conveniences for working with @_routes.
define_method(:_routes) { @_routes || routes }
define_method(:_generate_paths_by_default) do
supports_path
end
private :_generate_paths_by_default
end end
end end