aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/base/url_for.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_controller/base/url_for.rb')
-rw-r--r--actionpack/lib/action_controller/base/url_for.rb49
1 files changed, 49 insertions, 0 deletions
diff --git a/actionpack/lib/action_controller/base/url_for.rb b/actionpack/lib/action_controller/base/url_for.rb
new file mode 100644
index 0000000000..7119c14cd3
--- /dev/null
+++ b/actionpack/lib/action_controller/base/url_for.rb
@@ -0,0 +1,49 @@
+module ActionController
+ module UrlFor
+ extend ActiveSupport::Concern
+
+ include RackConvenience
+
+ def process_action(*)
+ initialize_current_url
+ super
+ end
+
+ def initialize_current_url
+ @url = UrlRewriter.new(request, params.clone)
+ end
+
+ # Overwrite to implement a number of default options that all url_for-based methods will use. The default options should come in
+ # the form of a hash, just like the one you would use for url_for directly. Example:
+ #
+ # def default_url_options(options)
+ # { :project => @project.active? ? @project.url_name : "unknown" }
+ # end
+ #
+ # As you can infer from the example, this is mostly useful for situations where you want to centralize dynamic decisions about the
+ # urls as they stem from the business domain. Please note that any individual url_for call can always override the defaults set
+ # by this method.
+ def default_url_options(options = nil)
+ end
+
+ def rewrite_options(options) #:nodoc:
+ if defaults = default_url_options(options)
+ defaults.merge(options)
+ else
+ options
+ end
+ end
+
+ def url_for(options = {})
+ options ||= {}
+ case options
+ when String
+ options
+ when Hash
+ @url.rewrite(rewrite_options(options))
+ else
+ polymorphic_url(options)
+ end
+ end
+ end
+end