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

Changeset 9114

Show
Ignore:
Timestamp:
03/28/08 19:58:46 (1 year ago)
Author:
david
Message:

Fixed that to_param should be used and honored instead of hardcoding the id (closes #11406) [gspiers]

Files:

Legend:

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

    r9093 r9114  
    11*SVN* 
     2 
     3* Fixed that to_param should be used and honored instead of hardcoding the id #11406 [gspiers] 
    24 
    35* Improve documentation. [Radar, Jan De Poorter, chuyeow, xaviershay, danger, miloops, Xavier Noria,  Sunny Ripert] 
  • trunk/activeresource/lib/active_resource/base.rb

    r8900 r9114  
    351351      def element_path(id, prefix_options = {}, query_options = nil) 
    352352        prefix_options, query_options = split_options(prefix_options) if query_options.nil? 
    353         "#{prefix(prefix_options)}#{collection_name}/#{id}.#{format.extension}#{query_string(query_options)}" 
     353        "#{prefix(prefix_options)}#{collection_name}/#{id}.#{format.extension}#{query_string(query_options)}"         
    354354      end 
    355355 
     
    761761    #   # => false 
    762762    def exists? 
    763       !new? && self.class.exists?(id, :params => prefix_options) 
     763      !new? && self.class.exists?(to_param, :params => prefix_options)       
    764764    end 
    765765 
     
    808808    #   # => Wilson Road 
    809809    def reload 
    810       self.load(self.class.find(id, :params => @prefix_options).attributes) 
     810      self.load(self.class.find(to_param, :params => @prefix_options).attributes) 
    811811    end 
    812812 
     
    904904 
    905905      def element_path(options = nil) 
    906         self.class.element_path(id, options || prefix_options) 
     906        self.class.element_path(to_param, options || prefix_options) 
    907907      end 
    908908 
  • trunk/activeresource/test/base_test.rb

    r8900 r9114  
    88    @matz  = { :id => 1, :name => 'Matz' }.to_xml(:root => 'person') 
    99    @david = { :id => 2, :name => 'David' }.to_xml(:root => 'person') 
     10    @greg  = { :id => 3, :name => 'Greg' }.to_xml(:root => 'person')     
    1011    @addy  = { :id => 1, :street => '12345 Street' }.to_xml(:root => 'address') 
    1112    @default_request_headers = { 'Content-Type' => 'application/xml' } 
     
    1415    @people_david = [{ :id => 2, :name => 'David' }].to_xml(:root => 'people') 
    1516    @addresses = [{ :id => 1, :street => '12345 Street' }].to_xml(:root => 'addresses') 
    16      
     17 
    1718    ActiveResource::HttpMock.respond_to do |mock| 
    18       mock.get    "/people/1.xml",             {}, @matz 
    19       mock.get    "/people/2.xml",             {}, @david 
    20       mock.get    "/people/3.xml",             {'key' => 'value'}, nil, 404 
    21       mock.put    "/people/1.xml",             {}, nil, 204 
    22       mock.delete "/people/1.xml",             {}, nil, 200 
    23       mock.delete "/people/2.xml",             {}, nil, 400 
    24       mock.get    "/people/99.xml",            {}, nil, 404 
    25       mock.post   "/people.xml",               {}, @rick, 201, 'Location' => '/people/5.xml' 
    26       mock.get    "/people.xml",               {}, @people 
    27       mock.get    "/people/1/addresses.xml",   {}, @addresses 
    28       mock.get    "/people/1/addresses/1.xml", {}, @addy 
    29       mock.get    "/people/1/addresses/2.xml", {}, nil, 404 
    30       mock.get    "/people/2/addresses/1.xml", {}, nil, 404 
    31       mock.put    "/people/1/addresses/1.xml", {}, nil, 204 
    32       mock.delete "/people/1/addresses/1.xml", {}, nil, 200 
    33       mock.post   "/people/1/addresses.xml",   {}, nil, 201, 'Location' => '/people/1/addresses/5' 
    34       mock.get    "/people//addresses.xml",    {}, nil, 404 
    35       mock.get    "/people//addresses/1.xml",  {}, nil, 404 
    36       mock.put    "/people//addresses/1.xml",  {}, nil, 404 
    37       mock.delete "/people//addresses/1.xml",  {}, nil, 404 
    38       mock.post   "/people//addresses.xml",    {}, nil, 404 
    39       mock.head   "/people/1.xml",             {}, nil, 200 
    40       mock.head   "/people/99.xml",            {}, nil, 404 
    41       mock.head   "/people/1/addresses/1.xml", {}, nil, 200 
    42       mock.head   "/people/1/addresses/2.xml", {}, nil, 404 
    43       mock.head   "/people/2/addresses/1.xml", {}, nil, 404 
     19      mock.get    "/people/1.xml",                {}, @matz 
     20      mock.get    "/people/2.xml",                {}, @david 
     21      mock.get    "/people/Greg.xml",             {}, @greg       
     22      mock.get    "/people/4.xml",                {'key' => 'value'}, nil, 404 
     23      mock.put    "/people/1.xml",                {}, nil, 204 
     24      mock.delete "/people/1.xml",                {}, nil, 200 
     25      mock.delete "/people/2.xml",                {}, nil, 400 
     26      mock.get    "/people/99.xml",               {}, nil, 404 
     27      mock.post   "/people.xml",                  {}, @rick, 201, 'Location' => '/people/5.xml' 
     28      mock.get    "/people.xml",                  {}, @people 
     29      mock.get    "/people/1/addresses.xml",      {}, @addresses 
     30      mock.get    "/people/1/addresses/1.xml",    {}, @addy 
     31      mock.get    "/people/1/addresses/2.xml",    {}, nil, 404 
     32      mock.get    "/people/2/addresses/1.xml",    {}, nil, 404 
     33      mock.get    "/people/Greg/addresses/1.xml", {}, @addy       
     34      mock.put    "/people/1/addresses/1.xml",    {}, nil, 204 
     35      mock.delete "/people/1/addresses/1.xml",    {}, nil, 200 
     36      mock.post   "/people/1/addresses.xml",      {}, nil, 201, 'Location' => '/people/1/addresses/5' 
     37      mock.get    "/people//addresses.xml",       {}, nil, 404 
     38      mock.get    "/people//addresses/1.xml",     {}, nil, 404 
     39      mock.put    "/people//addresses/1.xml",     {}, nil, 404 
     40      mock.delete "/people//addresses/1.xml",     {}, nil, 404 
     41      mock.post   "/people//addresses.xml",       {}, nil, 404 
     42      mock.head   "/people/1.xml",                {}, nil, 200 
     43      mock.head   "/people/Greg.xml",             {}, nil, 200 
     44      mock.head   "/people/99.xml",               {}, nil, 404 
     45      mock.head   "/people/1/addresses/1.xml",    {}, nil, 200 
     46      mock.head   "/people/1/addresses/2.xml",    {}, nil, 404 
     47      mock.head   "/people/2/addresses/1.xml",    {}, nil, 404 
     48      mock.head   "/people/Greg/addresses/1.xml", {}, nil, 200 
    4449    end 
    4550 
     
    303308    assert_equal '/people/1/addresses/1.xml', StreetAddress.element_path(1, :person_id => 1) 
    304309    assert_equal '/people/1/addresses/1.xml', StreetAddress.element_path(1, 'person_id' => 1) 
     310    assert_equal '/people/Greg/addresses/1.xml', StreetAddress.element_path(1, 'person_id' => 'Greg')     
     311  end 
     312   
     313  def test_custom_element_path_with_redefined_to_param 
     314    Person.module_eval do 
     315      alias_method :original_to_param_element_path, :to_param 
     316       def to_param   
     317         name 
     318       end 
     319    end 
     320 
     321    # Class method. 
     322    assert_equal '/people/Greg.xml', Person.element_path('Greg') 
     323     
     324    # Protected Instance method. 
     325    assert_equal '/people/Greg.xml', Person.find('Greg').send(:element_path) 
     326 
     327    ensure 
     328      # revert back to original 
     329      Person.module_eval do 
     330        # save the 'new' to_param so we don't get a warning about discarding the method 
     331        alias_method :element_path_to_param, :to_param 
     332        alias_method :to_param, :original_to_param_element_path 
     333      end 
    305334  end 
    306335 
     
    407436  def test_custom_header 
    408437    Person.headers['key'] = 'value' 
    409     assert_raises(ActiveResource::ResourceNotFound) { Person.find(3) } 
     438    assert_raises(ActiveResource::ResourceNotFound) { Person.find(4) } 
    410439  ensure 
    411440    Person.headers.delete('key') 
     
    487516    assert_equal address, address.reload 
    488517  end 
     518   
     519  def test_reload_with_redefined_to_param 
     520    Person.module_eval do 
     521      alias_method :original_to_param_reload, :to_param 
     522       def to_param   
     523         name 
     524       end 
     525    end 
     526 
     527    person = Person.find('Greg') 
     528    assert_equal person, person.reload 
     529 
     530    ensure 
     531      # revert back to original 
     532      Person.module_eval do 
     533        # save the 'new' to_param so we don't get a warning about discarding the method 
     534        alias_method :reload_to_param, :to_param 
     535        alias_method :to_param, :original_to_param_reload 
     536      end 
     537  end   
    489538   
    490539  def test_reload_works_without_prefix_options     
     
    596645  end 
    597646   
     647  def test_exists_with_redefined_to_param 
     648    Person.module_eval do 
     649      alias_method :original_to_param_exists, :to_param 
     650       def to_param   
     651         name 
     652       end 
     653    end 
     654 
     655    # Class method. 
     656    assert Person.exists?('Greg')     
     657 
     658    # Instance method. 
     659    assert Person.find('Greg').exists?     
     660 
     661    # Nested class method. 
     662    assert StreetAddress.exists?(1,  :params => { :person_id => Person.find('Greg').to_param })     
     663 
     664    # Nested instance method. 
     665    assert StreetAddress.find(1, :params => { :person_id => Person.find('Greg').to_param }).exists? 
     666 
     667    ensure 
     668      # revert back to original 
     669      Person.module_eval do 
     670        # save the 'new' to_param so we don't get a warning about discarding the method 
     671        alias_method :exists_to_param, :to_param 
     672        alias_method :to_param, :original_to_param_exists 
     673      end 
     674  end   
     675   
    598676  def test_to_xml 
    599677    matz = Person.find(1)