class ActionDispatch::Routing::RouteSet
def generate_url_helpers(supports_path)
def generate_url_helpers(supports_path) routes = self Module.new do extend ActiveSupport::Concern include UrlFor # Define url_for in the singleton level so one can do: # Rails.application.routes.url_helpers.url_for(args) proxy_class = Class.new do include UrlFor include routes.named_routes.path_helpers_module include routes.named_routes.url_helpers_module attr_reader :_routes def initialize(routes) @_routes = routes end def optimize_routes_generation? @_routes.optimize_routes_generation? end end @_proxy = proxy_class.new(routes) class << self def url_for(options) @_proxy.url_for(options) end def full_url_for(options) @_proxy.full_url_for(options) end def route_for(name, *args) @_proxy.route_for(name, *args) end def optimize_routes_generation? @_proxy.optimize_routes_generation? end def polymorphic_url(record_or_hash_or_array, options = {}) @_proxy.polymorphic_url(record_or_hash_or_array, options) end def polymorphic_path(record_or_hash_or_array, options = {}) @_proxy.polymorphic_path(record_or_hash_or_array, options) end def _routes; @_proxy._routes; end def url_options; {}; 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 redefine_singleton_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 # If the module is included more than once (for example, in a subclass # of an ancestor that includes the module), ensure that the `_routes` # singleton and instance methods return the desired route set by # including a new copy of the module (recursively if necessary). Note # that this method is called for each inclusion, whereas the above # `included` block is run only for the initial inclusion of each copy. def self.included(base) super if base.respond_to?(:_routes) && !base._routes.equal?(@_proxy._routes) @dup_for_reinclude ||= self.dup base.include @dup_for_reinclude end end end end