This project is archived and is in readonly mode.
When using accepts_nested_attributes_for, update_attributes! on association doesn't call after_update callback
Reported by Emmanuel Nicolau | March 11th, 2009 @ 02:19 AM | in 2.x
class Person < ActiveRecord::Base
has_many :children
accepts_nested_attributes_for :children
end
class Child < ActiveRecord::Base
belongs_to :person
after_update :do_something
def do_something
puts 'on after_update'
end
end
p = Person.create!(:name => "Smith", :children_attributes => {"new_1" => {:name => "John"}})
# => #<Person id: 5 ...>
p.update_attributes :name => "Smith29", :children_attributes => {p.children.first.id => {:name => "John"}}
# "on after_update"
p.update_attributes! :name => "Smith29", :children_attributes => {p.children.first.id => {:name => "John"}}
# prints nothing
Comments and changes to this ticket
-

Emmanuel Nicolau March 11th, 2009 @ 02:23 AM
- Title changed from When using accepts_nested_attributes_for update_attributes! on association doesn't call after_update callback to When using accepts_nested_attributes_for, update_attributes! on association doesn't call after_update callback
-

Eloy Duran March 11th, 2009 @ 02:53 PM
- Assigned user set to Eloy Duran
- State changed from new to open
- Milestone cleared.
-

Eloy Duran March 11th, 2009 @ 03:05 PM
- Milestone set to 2.x
-

-

rdavila April 21st, 2010 @ 09:48 PM
This works fine for me in Rails 2.3.5 and Ruby 1.8.7, and the correct syntax is:
p.update_attributes! :name => "Smith29", :children_attributes => [{ :id => p.children.first.id, :name => "John" }] -

Chris Flipse April 24th, 2010 @ 07:56 PM
This actually looks like it's not a bug -- it's the dirty attributes behaving correctly
p = Person.create!(:name => "Smith", :children_attributes => {"new_1" => {:name => "John"}}) # after save # => #<Person id: 3 ...> p.update_attributes! :name => "Smith29", :children_attributes => [{ :id => p.children.first.id, :name => "John" }] # => true p.update_attributes! :name => "Smith30", :children_attributes => [{ :id => p.children.first.id, :name => "Joe" }] after update after save # => trueFirst update doesn't actually change the child's attributes, so it's never marked as dirty, so it's never acutally saved.
Second update changes the child's attributes, and the callbacks work fine.
-

Jeremy Kemper April 24th, 2010 @ 09:57 PM
- State changed from open to invalid
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
<h2 style="font-size: 14px">Tickets have moved to Github</h2>
The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>