I’ve run into an odd case where a model called “Callback” breaks
ActiveRecord::Callbacks, for models other then itself.
It’s understandable if Callback is a model name I shouldn’t have used,
but its rather insidious in that it works just fine on its own, but
breaks when “belongs_to” from other models includes it.
The following is how to duplicate this, and the results I’m getting.
echo “create database a_development” | mysql -u root ; rails a;cd a;
ruby script/generate model callback;ruby script/generate model
example;rake db:migrate
Edit app/model/example.rb
{{{
class Example < ActiveRecord::Base
belongs_to :callback # This line breaks ActiveRecord::Callbacks
for Example.rb
def before_create
puts “#{self.class.name} :: This should say something,
but doesn’t”
end
def after_create
puts "#{self.class.name} :: after_create says nothing"
end
def before_save
puts "#{self.class.name} :: before_save says nothing"
end
def after_save
puts "#{self.class.name} :: after_save says nothing"
end
def validate
puts "#{self.class.name} :: validate works"
end
end
}}}
Edit app/model/callback.rb
{{{
class Callback < ActiveRecord::Base
def before_create
puts "#{self.class.name} :: before_create "
end
def after_create
puts "#{self.class.name} :: after_create "
end
def before_save
puts "#{self.class.name} :: before_save "
end
def after_save
puts "#{self.class.name} :: after_save "
end
def validate
puts "#{self.class.name} :: validate works"
end
end
}}}
ruby script/console
e = Example.new
=> #<Example:0x3268c04 @new_record=true, @attributes={}>e.save
Example :: validate works
=> truec = Callback.new
=> #<Callback:0x3210cac @new_record=true, @attributes={}>c.save
Callback :: validate works
Callback :: before_save
Callback :: before_create
Callback :: after_create
Callback :: after_save
=> true
So it looks like Callback.rb callbacks work, but Example.rb callbacks
don’t.
If I comment out the “:belongs_to :callback” then callbacks work for
Example.rb
Not really sure what to make of this, other then don’t use any name that
ActiveRecord makes use of.