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.rb64
1 files changed, 39 insertions, 25 deletions
diff --git a/actionpack/lib/action_controller/polymorphic_routes.rb b/actionpack/lib/action_controller/polymorphic_routes.rb
index c60b533205..6c21bc27c5 100644
--- a/actionpack/lib/action_controller/polymorphic_routes.rb
+++ b/actionpack/lib/action_controller/polymorphic_routes.rb
@@ -1,31 +1,29 @@
module ActionController
module PolymorphicRoutes
- def polymorphic_url(record_or_hash, options = {})
- record = extract_record(record_or_hash)
-
- case
- when options[:action] == "new"
- send(
- action_prefix(options) + RecordIdentifier.singular_class_name(record) + routing_type(options)
- )
-
- when record.respond_to?(:new_record?) && record.new_record?
- send(
- action_prefix(options) + RecordIdentifier.plural_class_name(record) + routing_type(options)
- )
-
- else
- send(
- action_prefix(options) + RecordIdentifier.singular_class_name(record) + routing_type(options), record_or_hash
- )
- end
+ def polymorphic_url(record_or_hash_or_array, options = {})
+ record = extract_record(record_or_hash_or_array)
+
+ args = []
+ inflection =
+ case
+ when options[:action] == "new"
+ :singular
+ when record.respond_to?(:new_record?) && record.new_record?
+ :plural
+ else
+ args = [record_or_hash_or_array]
+ :singular
+ end
+
+ named_route = build_named_route_call(record_or_hash_or_array, inflection, options)
+ send(named_route, *args)
end
- def polymorphic_path(record_or_hash)
- polymorphic_url(record_or_hash, :routing_type => :path)
+ def polymorphic_path(record_or_hash_or_array)
+ polymorphic_url(record_or_hash_or_array, :routing_type => :path)
end
- %w( edit new formatted ).each do |action|
+ %w(edit new formatted).each do |action|
module_eval <<-EOT, __FILE__, __LINE__
def #{action}_polymorphic_url(record_or_hash)
polymorphic_url(record_or_hash, :action => "#{action}")
@@ -44,11 +42,27 @@ module ActionController
end
def routing_type(options)
- "_#{options[:routing_type] || "url"}"
+ "#{options[:routing_type] || "url"}"
+ end
+
+ def build_named_route_call(records, inflection, options = {})
+ records = Array.new([extract_record(records)]) unless records.is_a?(Array)
+ base_segment = "#{RecordIdentifier.send("#{inflection}_class_name", records.pop)}_"
+
+ method_root = records.reverse.inject(base_segment) do |string, name|
+ segment = "#{RecordIdentifier.send("singular_class_name", name)}_"
+ segment << string
+ end
+
+ action_prefix(options) + method_root + routing_type(options)
end
- def extract_record(record_or_hash)
- record_or_hash.is_a?(Hash) ? record_or_hash[:id] : record_or_hash
+ def extract_record(record_or_hash_or_array)
+ case record_or_hash_or_array
+ when Array: record_or_hash_or_array.last
+ when Hash: record_or_hash_or_array[:id]
+ else record_or_hash_or_array
+ end
end
end
end