Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 8525

Show
Ignore:
Timestamp:
01/02/08 09:14:34 (4 months ago)
Author:
bitsweat
Message:

find_or_create_resource_for handles module nesting. Closes #10646.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/activeresource/CHANGELOG

    r8503 r8525  
    11*SVN* 
     2 
     3* find_or_create_resource_for handles module nesting.  #10646 [xavier] 
    24 
    35* Allow setting ActiveResource::Base#format before #site.  [rick] 
  • trunk/activeresource/lib/active_resource/base.rb

    r8503 r8525  
    846846      end 
    847847       
     848      # Tries to find a resource in a non empty list of nested modules 
     849      # Raises a NameError if it was not found in any of the given nested modules 
     850      def find_resource_in_modules(resource_name, module_names) 
     851        receiver = Object 
     852        namespaces = module_names[0, module_names.size-1].map do |module_name| 
     853          receiver = receiver.const_get(module_name) 
     854        end 
     855        if namespace = namespaces.reverse.detect { |ns| ns.const_defined?(resource_name) } 
     856          return namespace.const_get(resource_name) 
     857        else 
     858          raise NameError 
     859        end 
     860      end 
     861 
    848862      # Tries to find a resource for a given name; if it fails, then the resource is created 
    849863      def find_or_create_resource_for(name) 
    850864        resource_name = name.to_s.camelize 
    851  
    852         # FIXME: Make it generic enough to support any depth of module nesting 
    853         if (ancestors = self.class.name.split("::")).size > 1 
    854           begin 
    855             ancestors.first.constantize.const_get(resource_name) 
    856           rescue NameError 
    857             self.class.const_get(resource_name) 
    858           end 
     865        ancestors = self.class.name.split("::") 
     866        if ancestors.size > 1 
     867          find_resource_in_modules(resource_name, ancestors) 
    859868        else 
    860869          self.class.const_get(resource_name) 
  • trunk/activeresource/test/base/load_test.rb

    r7719 r8525  
    1111    self.site = "http://37s.sunrise.i:3000" 
    1212  end 
     13 
     14  module Deeply 
     15    module Nested 
     16 
     17      class Note < ActiveResource::Base 
     18        self.site = "http://37s.sunrise.i:3000" 
     19      end 
     20 
     21       class Comment < ActiveResource::Base 
     22         self.site = "http://37s.sunrise.i:3000" 
     23       end 
     24 
     25       module TestDifferentLevels 
     26 
     27         class Note < ActiveResource::Base 
     28           self.site = "http://37s.sunrise.i:3000" 
     29         end 
     30 
     31       end 
     32 
     33    end 
     34  end 
     35 
    1336end 
    1437 
     
    109132    assert_kind_of Highrise::Comment, n.comments.first 
    110133  end 
     134 
     135  def test_nested_collections_within_deeply_nested_namespace 
     136    n = Highrise::Deeply::Nested::Note.new(:comments => [{ :name => "1" }]) 
     137    assert_kind_of Highrise::Deeply::Nested::Comment, n.comments.first 
     138  end 
     139 
     140  def test_nested_collections_in_different_levels_of_namespaces 
     141    n = Highrise::Deeply::Nested::TestDifferentLevels::Note.new(:comments => [{ :name => "1" }]) 
     142    assert_kind_of Highrise::Deeply::Nested::Comment, n.comments.first 
     143  end 
     144 
     145 
    111146end