Ah les joies de se mettre à jour et son code à l’occasion … Oui depuis longtemps je trainais avec rails 1.2.6 (oui je sais ça commence à dater mais j’ai mes raisons). Il me tardait donc de pouvoir utiliser les nouvelles versions de rails avec son lots d’améliorations.
Bon tout d’abord grosse surprise un bug uniquement présent en development, et pour cause il concerne le système de déchargement/rechargement du code de l’application.
ça donne soit un
stack level too deep
ou alors un pénible
vendor/rails/activerecord/lib/active_record/attribute_methods.rb:142:in `create_time_zone_conversion_attribute?' vendor/rails/activerecord/lib/active_record/attribute_methods.rb:75:in `define_attribute_methods' vendor/rails/activerecord/lib/active_record/attribute_methods.rb:71:in `each' vendor/rails/activerecord/lib/active_record/attribute_methods.rb:71:in `define_attribute_methods' vendor/rails/activerecord/lib/active_record/attribute_methods.rb:242:in `method_missing'
Le problème semble être valable depuis rails 2.2 et toujours pas corrigé. Il semble que ce ne soit pas une priorité car le problème se pose uniquement en mode development.
Donc la solution est de patcher rails en attendant. Patch qui se trouve dans le ticket chez lighthouseapp :
if ENV['RAILS_ENV'] != 'production' class ActiveRecord::Base class_eval do def self.reset_subclasses nonreloadables = [] subclasses.each do |klass| unless ActiveSupport::Dependencies.autoloaded? klass nonreloadables << klass next end klass.instance_variables.each { |var| klass.send(:remove_instance_variable, var) } klass.instance_methods(false).each { |m| klass.send(:undef_method, m) unless m =~ /^id(=$|\?$|$)/ } end @@subclasses = {} nonreloadables.each { |klass| (@@subclasses[klass.superclass] ||= []) << klass } end end end end
Voilà et maintenant ça roule on peut développer en paix.