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

Ticket #10646: activeresource_nested_modules_support.diff

File activeresource_nested_modules_support.diff, 3.1 kB (added by xavier, 5 months ago)
  • activeresource/test/base/load_test.rb

    old new  
    1010  class Comment < ActiveResource::Base 
    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 
    1538 
     
    108131    n = Highrise::Note.new(:comments => [{ :name => "1" }]) 
    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 
  • activeresource/lib/active_resource/base.rb

    old new  
    845845        find_or_create_resource_for(name.to_s.singularize) 
    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) 
    861870        end