From 9a97f9a14bb7cce56bceccca8755d42598be2290 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Wed, 2 Jan 2008 09:14:34 +0000 Subject: find_or_create_resource_for handles module nesting. Closes #10646. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8525 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activeresource/lib/active_resource/base.rb | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'activeresource/lib/active_resource/base.rb') diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb index 76f4ca03db..25776265e9 100644 --- a/activeresource/lib/active_resource/base.rb +++ b/activeresource/lib/active_resource/base.rb @@ -845,17 +845,26 @@ module ActiveResource find_or_create_resource_for(name.to_s.singularize) end + # Tries to find a resource in a non empty list of nested modules + # Raises a NameError if it was not found in any of the given nested modules + def find_resource_in_modules(resource_name, module_names) + receiver = Object + namespaces = module_names[0, module_names.size-1].map do |module_name| + receiver = receiver.const_get(module_name) + end + if namespace = namespaces.reverse.detect { |ns| ns.const_defined?(resource_name) } + return namespace.const_get(resource_name) + else + raise NameError + end + end + # Tries to find a resource for a given name; if it fails, then the resource is created def find_or_create_resource_for(name) resource_name = name.to_s.camelize - - # FIXME: Make it generic enough to support any depth of module nesting - if (ancestors = self.class.name.split("::")).size > 1 - begin - ancestors.first.constantize.const_get(resource_name) - rescue NameError - self.class.const_get(resource_name) - end + ancestors = self.class.name.split("::") + if ancestors.size > 1 + find_resource_in_modules(resource_name, ancestors) else self.class.const_get(resource_name) end -- cgit v1.2.3