Has anyone seen Rails save nested associations despite their being
invalid?
If I hit the site from a different Rails app (using ActiveResource)
and try to update the record so that the username is too short it
fails (as I expect) and adds an errors attribute to the object that I
can inspect. The original account (and associated user and email
objects) is unaffected, as I''d expect.
Hitting the same exact URL with a raw HTTP/REST client and sending in
XML:
<?xml version="1.0" encoding="UTF-8"?>
<account>
<id>1</id>
<user>
<birthdate>2010-01-05</birthdate>
<username>soto</username>
</user>
<email>
<address>sotom-yvXPQGROKvA@public.gmane.org</address>
<opt-in>true</opt-
in>
<opt-in-ch1>false</opt-in-ch1>
</email>
</account>
It gives me the expected 422 Unprocessible Entity error, which I
expect. However it also saves user down as a null! That I do not
expect.
My question is why does it correctly handle errors with ActiveResource
(eg. doesn''t save anything down since their are validation problems)
but with a raw PUT request it saves with a null user object
(effectively killing the user).
# models
class User < ActiveRecord::Base
belongs_to :account
validates_length_of :username, :minimum => 6
end
class Account < ActiveRecord::Base
has_one :user
has_one :email
has_many :account_entitlements
has_many :entitlements, :through => :account_entitlements
accepts_nested_attributes_for :user, :email
def user=(params)
update_attributes(:user_attributes => params)
end
def email=(params)
update_attributes(:email_attributes => params)
end
end
# controller
def update
@account = Account.find(params[:id])
respond_to do |format|
if @account.update_attributes(params[:account])
flash[:notice] = ''Account was successfully updated.''
format.html { redirect_to(@account) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @account.errors, :status
=> :unprocessable_entity }
end
end
end