aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/polymorphic_routes.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_controller/polymorphic_routes.rb')
-rw-r--r--actionpack/lib/action_controller/polymorphic_routes.rb52
1 files changed, 52 insertions, 0 deletions
diff --git a/actionpack/lib/action_controller/polymorphic_routes.rb b/actionpack/lib/action_controller/polymorphic_routes.rb
new file mode 100644
index 0000000000..eeddc28d60
--- /dev/null
+++ b/actionpack/lib/action_controller/polymorphic_routes.rb
@@ -0,0 +1,52 @@
+module ActionController
+ module PolymorphicRoutes
+ extend self
+
+ def polymorphic_url(record_or_hash, url_writer, options = {})
+ record = extract_record(record_or_hash)
+
+ case
+ when options[:action] == "new"
+ url_writer.send(action_prefix(options) + RecordIdentifier.singular_class_name(record) + routing_type(options))
+
+ when record.respond_to?(:new_record?) && record.new_record?
+ url_writer.send(RecordIdentifier.plural_class_name(record) + routing_type(options))
+
+ else
+ url_writer.send(
+ action_prefix(options) + RecordIdentifier.singular_class_name(record) + routing_type(options), record_or_hash
+ )
+ end
+ end
+
+ def polymorphic_path(record_or_hash, url_writer)
+ polymorphic_url(record_or_hash, url_writer, :routing_type => :path)
+ end
+
+ %w( edit new formatted ).each do |action|
+ module_eval <<-EOT
+ def #{action}_polymorphic_url(record_or_hash, url_writer)
+ polymorphic_url(record_or_hash, url_writer, :action => "#{action}")
+ end
+
+ def #{action}_polymorphic_path(record_or_hash, url_writer)
+ polymorphic_url(record_or_hash, url_writer, :action => "#{action}", :routing_type => :path)
+ end
+ EOT
+ end
+
+
+ private
+ def action_prefix(options)
+ options[:action] ? "#{options[:action]}_" : ""
+ end
+
+ def routing_type(options)
+ "_#{options[:routing_type] || "url"}"
+ end
+
+ def extract_record(record_or_hash)
+ record_or_hash.is_a?(Hash) ? record_or_hash[:id] : record_or_hash
+ end
+ end
+end \ No newline at end of file