<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,5 +1,7 @@
 *SVN*
 
+* Ensure that save on parent object fails for invalid has_one association. Closes #10518. [Pratik]
+
 * Remove duplicate code from associations. [Pratik]
 
 * Refactor HasManyThroughAssociation to inherit from HasManyAssociation. Association callbacks and &lt;association&gt;_ids= now work with hm:t. #11516 [rubyruy]</diff>
      <filename>activerecord/CHANGELOG</filename>
    </modified>
    <modified>
      <diff>@@ -784,6 +784,7 @@ module ActiveRecord
           end
           after_save method_name
 
+          add_single_associated_save_callbacks(reflection.name) 
           association_accessor_methods(reflection, HasOneAssociation)
           association_constructor_method(:build,  reflection, HasOneAssociation)
           association_constructor_method(:create, reflection, HasOneAssociation)
@@ -1141,6 +1142,18 @@ module ActiveRecord
           end
         end
         
+        def add_single_associated_save_callbacks(association_name)
+          method_name = &quot;validate_associated_records_for_#{association_name}&quot;.to_sym
+          define_method(method_name) do
+            association = instance_variable_get(&quot;@#{association_name}&quot;)
+            if !association.nil?
+              errors.add &quot;#{association_name}&quot; unless association.target.nil? || association.valid?
+            end
+          end
+        
+          validate method_name
+        end
+        
         def add_multiple_associated_save_callbacks(association_name)
           method_name = &quot;validate_associated_records_for_#{association_name}&quot;.to_sym
           ivar = &quot;@#{association_name}&quot;</diff>
      <filename>activerecord/lib/active_record/associations.rb</filename>
    </modified>
    <modified>
      <diff>@@ -433,6 +433,18 @@ class HasOneAssociationsTest &lt; ActiveRecord::TestCase
     assert_equal a, firm.account
     assert_equal a, firm.account(true)
   end
+  
+  def test_save_fails_for_invalid_has_one
+    firm = Firm.find(:first)
+    assert firm.valid?
+    
+    firm.account = Account.new
+    
+    assert !firm.account.valid?
+    assert !firm.valid?
+    assert !firm.save
+    assert_equal &quot;is invalid&quot;, firm.errors.on(&quot;account&quot;)
+  end
 
   def test_assignment_before_either_saved
     firm = Firm.new(&quot;name&quot; =&gt; &quot;GlobalMegaCorp&quot;)</diff>
      <filename>activerecord/test/cases/associations_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>9bc75fd007d56d818b8620569410a20aa92c9fc5</id>
    </parent>
  </parents>
  <author>
    <name>Pratik Naik</name>
    <email>pratiknaik@gmail.com</email>
  </author>
  <url>http://github.com/rails/rails/commit/7ddc8f2e1bc9c818b622373a8c85bd679533cefd</url>
  <id>7ddc8f2e1bc9c818b622373a8c85bd679533cefd</id>
  <committed-date>2008-04-05T19:32:51-07:00</committed-date>
  <authored-date>2008-04-05T19:32:51-07:00</authored-date>
  <message>Ensure that save on parent object fails for invalid has_one association. Closes #10518. [Pratik]


git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@9232 5ecf4fe2-1ee6-0310-87b1-e25e094e27de</message>
  <tree>683b5c10891b4e7704404fcf3de81da08f02a54b</tree>
  <committer>
    <name>Pratik Naik</name>
    <email>pratiknaik@gmail.com</email>
  </committer>
</commit>
