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

Changeset 9232

Show
Ignore:
Timestamp:
04/06/08 02:32:51 (1 month ago)
Author:
pratik
Message:

Ensure that save on parent object fails for invalid has_one association. Closes #10518. [Pratik]

Files:

Legend:

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

    r9231 r9232  
    11*SVN* 
     2 
     3* Ensure that save on parent object fails for invalid has_one association. Closes #10518. [Pratik] 
    24 
    35* Remove duplicate code from associations. [Pratik] 
  • trunk/activerecord/lib/active_record/associations.rb

    r9230 r9232  
    785785          after_save method_name 
    786786 
     787          add_single_associated_save_callbacks(reflection.name)  
    787788          association_accessor_methods(reflection, HasOneAssociation) 
    788789          association_constructor_method(:build,  reflection, HasOneAssociation) 
     
    11421143        end 
    11431144         
     1145        def add_single_associated_save_callbacks(association_name) 
     1146          method_name = "validate_associated_records_for_#{association_name}".to_sym 
     1147          define_method(method_name) do 
     1148            association = instance_variable_get("@#{association_name}") 
     1149            if !association.nil? 
     1150              errors.add "#{association_name}" unless association.target.nil? || association.valid? 
     1151            end 
     1152          end 
     1153         
     1154          validate method_name 
     1155        end 
     1156         
    11441157        def add_multiple_associated_save_callbacks(association_name) 
    11451158          method_name = "validate_associated_records_for_#{association_name}".to_sym 
  • trunk/activerecord/test/cases/associations_test.rb

    r9230 r9232  
    434434    assert_equal a, firm.account(true) 
    435435  end 
     436   
     437  def test_save_fails_for_invalid_has_one 
     438    firm = Firm.find(:first) 
     439    assert firm.valid? 
     440     
     441    firm.account = Account.new 
     442     
     443    assert !firm.account.valid? 
     444    assert !firm.valid? 
     445    assert !firm.save 
     446    assert_equal "is invalid", firm.errors.on("account") 
     447  end 
    436448 
    437449  def test_assignment_before_either_saved