aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch/routing/route_set.rb
diff options
context:
space:
mode:
authorJoshua Peek <josh@joshpeek.com>2010-03-09 20:50:35 -0600
committerJoshua Peek <josh@joshpeek.com>2010-03-09 20:50:35 -0600
commit7db80f87e9c194713c2016820e39af6043ddf8d0 (patch)
tree310fb27f2831a8fcf1598f4522e28e236f5d8172 /actionpack/lib/action_dispatch/routing/route_set.rb
parenta87683fb38d6cf66f39a7bd3faa6c969c63b1f46 (diff)
downloadrails-7db80f87e9c194713c2016820e39af6043ddf8d0.tar.gz
rails-7db80f87e9c194713c2016820e39af6043ddf8d0.tar.bz2
rails-7db80f87e9c194713c2016820e39af6043ddf8d0.zip
Move AC::UrlRewriter onto route set
Diffstat (limited to 'actionpack/lib/action_dispatch/routing/route_set.rb')
-rw-r--r--actionpack/lib/action_dispatch/routing/route_set.rb56
1 files changed, 56 insertions, 0 deletions
diff --git a/actionpack/lib/action_dispatch/routing/route_set.rb b/actionpack/lib/action_dispatch/routing/route_set.rb
index e99e39269b..15c7cd00ba 100644
--- a/actionpack/lib/action_dispatch/routing/route_set.rb
+++ b/actionpack/lib/action_dispatch/routing/route_set.rb
@@ -410,6 +410,38 @@ module ActionDispatch
Generator.new(options, recall, @set, extras).generate
end
+ RESERVED_OPTIONS = [:anchor, :params, :only_path, :host, :protocol, :port, :trailing_slash, :skip_relative_url_root]
+
+ # TODO: Terrible method name
+ def rewrite(options)
+ handle_positional_args(options)
+
+ rewritten_url = ""
+
+ path_segments = options.delete(:_path_segments)
+
+ unless options[:only_path]
+ rewritten_url << (options[:protocol] || "http")
+ rewritten_url << "://" unless rewritten_url.match("://")
+ rewritten_url << rewrite_authentication(options)
+
+ raise "Missing host to link to! Please provide :host parameter or set default_url_options[:host]" unless options[:host]
+
+ rewritten_url << options[:host]
+ rewritten_url << ":#{options.delete(:port)}" if options.key?(:port)
+ end
+
+ path_options = options.except(*RESERVED_OPTIONS)
+ path_options = yield(path_options) if block_given?
+ path = generate(path_options, path_segments || {})
+
+ # ROUTES TODO: This can be called directly, so script_name should probably be set in the router
+ rewritten_url << (options[:trailing_slash] ? path.sub(/\?|\z/) { "/" + $& } : path)
+ rewritten_url << "##{Rack::Utils.escape(options[:anchor].to_param.to_s)}" if options[:anchor]
+
+ rewritten_url
+ end
+
def call(env)
@set.call(env)
end
@@ -435,6 +467,30 @@ module ActionDispatch
raise ActionController::RoutingError, "No route matches #{path.inspect}"
end
+
+ private
+ def handle_positional_args(options)
+ return unless args = options.delete(:_positional_args)
+
+ keys = options.delete(:_positional_keys)
+ keys -= options.keys if args.size < keys.size - 1 # take format into account
+
+ args = args.zip(keys).inject({}) do |h, (v, k)|
+ h[k] = v
+ h
+ end
+
+ # Tell url_for to skip default_url_options
+ options.merge!(args)
+ end
+
+ def rewrite_authentication(options)
+ if options[:user] && options[:password]
+ "#{Rack::Utils.escape(options.delete(:user))}:#{Rack::Utils.escape(options.delete(:password))}@"
+ else
+ ""
+ end
+ end
end
end
end