diff options
Diffstat (limited to 'actionpack/lib/action_controller/url_rewriter.rb')
-rw-r--r-- | actionpack/lib/action_controller/url_rewriter.rb | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/actionpack/lib/action_controller/url_rewriter.rb b/actionpack/lib/action_controller/url_rewriter.rb index 0d13f2721f..d2b324da96 100644 --- a/actionpack/lib/action_controller/url_rewriter.rb +++ b/actionpack/lib/action_controller/url_rewriter.rb @@ -1,5 +1,4 @@ -module ActionController - +module ActionController # Write URLs from arbitrary places in your codebase, such as your mailers. # # Example: @@ -15,9 +14,7 @@ module ActionController # # In addition to providing +url_for+, named routes are also accessible after # including UrlWriter. - # module UrlWriter - # The default options for urls written by this writer. Typically a :host pair # is provided. mattr_accessor :default_url_options @@ -36,26 +33,28 @@ module ActionController # must be provided either explicitly, or via default_url_options. # * :protocol The protocol to connect to. Defaults to 'http' # * :port Optionally specify the port to connect to. - # def url_for(options) options = self.class.default_url_options.merge(options) url = '' + unless options.delete :only_path url << (options.delete(:protocol) || 'http') url << '://' unless url.match("://") #dont add separator if its already been specified in :protocol raise "Missing host to link to! Please provide :host parameter or set default_url_options[:host]" unless options[:host] + url << options.delete(:host) url << ":#{options.delete(:port)}" if options.key?(:port) else # Delete the unused options to prevent their appearance in the query string [:protocol, :host, :port].each { |k| options.delete k } end + url << Routing::Routes.generate(options, {}) + return url - end - + end end # Rewrites URLs for Base.redirect_to and Base.url_for in the controller. @@ -66,7 +65,7 @@ module ActionController end def rewrite(options = {}) - rewrite_url(rewrite_path(options), options) + rewrite_url(options) end def to_str @@ -76,17 +75,19 @@ module ActionController alias_method :to_s, :to_str private - def rewrite_url(path, options) + def rewrite_url(options) rewritten_url = "" + unless options[:only_path] rewritten_url << (options[:protocol] || @request.protocol) rewritten_url << "://" unless rewritten_url.match("://") + rewritten_url << rewrite_authentication(options) rewritten_url << (options[:host] || @request.host_with_port) rewritten_url << ":#{options.delete(:port)}" if options.key?(:port) end rewritten_url << @request.relative_url_root.to_s unless options[:skip_relative_url_root] - rewritten_url << path + rewritten_url << rewrite_path(options) rewritten_url << '/' if options[:trailing_slash] rewritten_url << "##{options[:anchor]}" if options[:anchor] @@ -96,15 +97,24 @@ module ActionController def rewrite_path(options) options = options.symbolize_keys options.update(options[:params].symbolize_keys) if options[:params] + if (overwrite = options.delete(:overwrite_params)) options.update(@parameters.symbolize_keys) options.update(overwrite.symbolize_keys) end - RESERVED_OPTIONS.each {|k| options.delete k} + + RESERVED_OPTIONS.each { |k| options.delete(k) } # Generates the query string, too Routing::Routes.generate(options, @request.symbolized_path_parameters) end + + def rewrite_authentication(options) + if options[:user] && options[:password] + "#{options.delete(:user)}:#{options.delete(:password)}@" + else + "" + end + end end - -end +end
\ No newline at end of file |