Merge pull request #6588 from nbibler/polymorphic_to_model

Correct the use of to_model in polymorphic routing
This commit is contained in:
José Valim 2012-06-01 07:40:41 -07:00
parent 3449b757da
commit 5c565a2942
2 changed files with 34 additions and 2 deletions

@ -95,7 +95,7 @@ def polymorphic_url(record_or_hash_or_array, options = {})
end
record = extract_record(record_or_hash_or_array)
record = record.to_model if record.respond_to?(:to_model)
record = convert_to_model(record)
args = Array === record_or_hash_or_array ?
record_or_hash_or_array.dup :
@ -122,6 +122,8 @@ def polymorphic_url(record_or_hash_or_array, options = {})
args.last.kind_of?(Hash) ? args.last.merge!(url_options) : args << url_options
end
args.collect! { |a| convert_to_model(a) }
(proxy || self).send(named_route, *args)
end
@ -152,6 +154,10 @@ def action_prefix(options)
options[:action] ? "#{options[:action]}_" : ''
end
def convert_to_model(object)
object.respond_to?(:to_model) ? object.to_model : object
end
def routing_type(options)
options[:routing_type] || :url
end

@ -25,6 +25,24 @@ class Series < ActiveRecord::Base
self.table_name = 'projects'
end
class ModelDelegator < ActiveRecord::Base
self.table_name = 'projects'
def to_model
ModelDelegate.new
end
end
class ModelDelegate
def self.model_name
ActiveModel::Name.new(self)
end
def to_param
'overridden'
end
end
module Blog
class Post < ActiveRecord::Base
self.table_name = 'projects'
@ -50,6 +68,7 @@ def setup
@bid = Bid.new
@tax = Tax.new
@fax = Fax.new
@delegator = ModelDelegator.new
@series = Series.new
@blog_post = Blog::Post.new
@blog_blog = Blog::Blog.new
@ -439,6 +458,13 @@ def test_uncountable_resource
end
end
def test_routing_a_to_model_delegate
with_test_routes do
@delegator.save
assert_equal "http://example.com/model_delegates/overridden", polymorphic_url(@delegator)
end
end
def with_namespaced_routes(name)
with_routing do |set|
set.draw do
@ -469,6 +495,7 @@ def with_test_routes(options = {})
resource :bid
end
resources :series
resources :model_delegates
end
self.class.send(:include, @routes.url_helpers)
@ -516,5 +543,4 @@ def with_admin_and_site_test_routes(options = {})
yield
end
end
end