mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
When assigning a has_one, if the new record fails to save, raise an error
This commit is contained in:
committed by
Aaron Patterson
parent
1bc71ed960
commit
7f7b480098
@@ -32,9 +32,9 @@ module ActiveRecord
|
||||
loaded
|
||||
|
||||
if @owner.persisted? && record && save
|
||||
record.save && self
|
||||
else
|
||||
record && self
|
||||
unless record.save
|
||||
raise RecordNotSaved, "Failed to save the new associated #{@reflection.name}."
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -93,18 +93,18 @@ class HasOneAssociationsTest < ActiveRecord::TestCase
|
||||
def test_nullification_on_association_change
|
||||
firm = companies(:rails_core)
|
||||
old_account_id = firm.account.id
|
||||
firm.account = Account.new
|
||||
firm.account = Account.new(:credit_limit => 5)
|
||||
# account is dependent with nullify, therefore its firm_id should be nil
|
||||
assert_nil Account.find(old_account_id).firm_id
|
||||
end
|
||||
|
||||
def test_association_change_calls_delete
|
||||
companies(:first_firm).deletable_account = Account.new
|
||||
companies(:first_firm).deletable_account = Account.new(:credit_limit => 5)
|
||||
assert_equal [], Account.destroyed_account_ids[companies(:first_firm).id]
|
||||
end
|
||||
|
||||
def test_association_change_calls_destroy
|
||||
companies(:first_firm).account = Account.new
|
||||
companies(:first_firm).account = Account.new(:credit_limit => 5)
|
||||
assert_equal [companies(:first_firm).id], Account.destroyed_account_ids[companies(:first_firm).id]
|
||||
end
|
||||
|
||||
@@ -182,17 +182,6 @@ class HasOneAssociationsTest < ActiveRecord::TestCase
|
||||
assert_equal account, firm.account
|
||||
end
|
||||
|
||||
def test_failing_build_association
|
||||
firm = Firm.new("name" => "GlobalMegaCorp")
|
||||
firm.save
|
||||
|
||||
firm.account = account = Account.new
|
||||
assert_equal account, firm.account
|
||||
assert !account.save
|
||||
assert_equal account, firm.account
|
||||
assert_equal ["can't be empty"], account.errors["credit_limit"]
|
||||
end
|
||||
|
||||
def test_create
|
||||
firm = Firm.new("name" => "GlobalMegaCorp")
|
||||
firm.save
|
||||
@@ -320,4 +309,15 @@ class HasOneAssociationsTest < ActiveRecord::TestCase
|
||||
assert_equal ships(:black_pearl), pirate.ship
|
||||
assert_equal pirate.id, pirate.ship.pirate_id
|
||||
end
|
||||
|
||||
def test_replacement_failure_due_to_new_record_should_raise_error
|
||||
pirate = pirates(:blackbeard)
|
||||
new_ship = Ship.new
|
||||
|
||||
assert_raise(ActiveRecord::RecordNotSaved) do
|
||||
pirate.ship = new_ship
|
||||
end
|
||||
assert_equal new_ship, pirate.ship
|
||||
assert_equal pirate.id, new_ship.pirate_id
|
||||
end
|
||||
end
|
||||
|
||||
@@ -90,7 +90,7 @@ class TestDefaultAutosaveAssociationOnAHasOneAssociation < ActiveRecord::TestCas
|
||||
firm = Firm.find(:first)
|
||||
assert firm.valid?
|
||||
|
||||
firm.account = Account.new
|
||||
firm.build_account
|
||||
|
||||
assert !firm.account.valid?
|
||||
assert !firm.valid?
|
||||
@@ -102,7 +102,7 @@ class TestDefaultAutosaveAssociationOnAHasOneAssociation < ActiveRecord::TestCas
|
||||
firm = Firm.find(:first)
|
||||
assert firm.valid?
|
||||
|
||||
firm.unvalidated_account = Account.new
|
||||
firm.build_unvalidated_account
|
||||
|
||||
assert !firm.unvalidated_account.valid?
|
||||
assert firm.valid?
|
||||
|
||||
Reference in New Issue
Block a user