From 8fb9df535e9fcf4c117ffd3254027e0fe2425cb7 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Wed, 4 Aug 2010 23:00:33 +0200 Subject: Modified polymorphic_url to check for model's namespace This change allows using namespaced models with polymorphic_url, in the way that you would use them without namespace. Let's say that you have Blog::Post model in namespaced Engine. When you use polymorphic_path with Blog::Post instances, like in form_for(@post), it will look for blog_posts_path named url helper. As we are inside Blog::Engine, it's annoying to always use the prefix. With this commit, blog_ prefix will be removed and posts_path will be called. --- .../action_dispatch/routing/polymorphic_routes.rb | 4 +++ railties/test/railties/engine_test.rb | 34 +++++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/actionpack/lib/action_dispatch/routing/polymorphic_routes.rb b/actionpack/lib/action_dispatch/routing/polymorphic_routes.rb index 15ee7c8051..037b94b577 100644 --- a/actionpack/lib/action_dispatch/routing/polymorphic_routes.rb +++ b/actionpack/lib/action_dispatch/routing/polymorphic_routes.rb @@ -111,6 +111,10 @@ module ActionDispatch args.last.kind_of?(Hash) ? args.last.merge!(url_options) : args << url_options end + if namespace = record.class.parents.detect { |n| n.respond_to?(:_railtie) } + named_route.sub!(/#{namespace._railtie.railtie_name}_/, '') + end + url_for _routes.url_helpers.__send__("hash_for_#{named_route}", *args) end diff --git a/railties/test/railties/engine_test.rb b/railties/test/railties/engine_test.rb index cda1d12fa8..fff925404d 100644 --- a/railties/test/railties/engine_test.rb +++ b/railties/test/railties/engine_test.rb @@ -352,6 +352,18 @@ module RailtiesTest end RUBY + @plugin.write "app/models/bukkits/post.rb", <<-RUBY + module Bukkits + class Post + extend ActiveModel::Naming + + def to_param + "1" + end + end + end + RUBY + app_file "config/routes.rb", <<-RUBY AppTemplate::Application.routes.draw do match "/bar" => "bar#index", :as => "bar" @@ -361,10 +373,14 @@ module RailtiesTest @plugin.write "config/routes.rb", <<-RUBY Bukkits::Engine.routes.draw do - match "/foo" => "bukkits/foo#index", :as => "foo" - match "/foo/show" => "bukkits/foo#show" - match "/from_app" => "bukkits/foo#from_app" - match "/routes_helpers_in_view" => "bukkits/foo#routes_helpers_in_view" + namespace(:bukkits, :path => nil, :shallow_path => nil, :as => nil) do + match "/foo" => "foo#index", :as => "foo" + match "/foo/show" => "foo#show" + match "/from_app" => "foo#from_app" + match "/routes_helpers_in_view" => "foo#routes_helpers_in_view" + match "/polymorphic_path_without_namespace" => "foo#polymorphic_path_without_namespace" + resources :posts + end end RUBY @@ -401,6 +417,10 @@ module RailtiesTest def routes_helpers_in_view render :inline => "<%= foo_path %>, <%= app.bar_path %>" end + + def polymorphic_path_without_namespace + render :text => polymorphic_path(Post.new) + end end RUBY @@ -411,6 +431,8 @@ module RailtiesTest end RUBY + add_to_config("config.action_dispatch.show_exceptions = false") + boot_rails assert_equal "bukkits_", Bukkits.table_name_prefix @@ -434,6 +456,10 @@ module RailtiesTest env = Rack::MockRequest.env_for("/bukkits/routes_helpers_in_view") response = AppTemplate::Application.call(env) assert_equal "/bukkits/foo, /bar", response[2].body + + env = Rack::MockRequest.env_for("/bukkits/polymorphic_path_without_namespace") + response = AppTemplate::Application.call(env) + assert_equal "/bukkits/posts/1", response[2].body end end end -- cgit v1.2.3