Les problèmes avec rails 2.3 continuent.
J’utilise depuis longtemps le plugin rails-engines qui permet de transformer une application en un plugin.
Et nouveauté de la version 2.3 de rails, RailsEngine y a été incorporé. Mais comme certains plugins qui ont été incorporé (has_finder, globalize, …) à chaque fois ce n’est pas complètement, bref il faut quand compléter les fonctionnalités en installant le plugin engine expurgé du code commun avec rails.
Mais bon ça bug encore, on obtient un :
A copy of X has been removed from the module tree but is still active!
ou bien un
can’t dup NilClass
uniquement en mode dev … grrr
Alors heureusement, d’autres sont passé par là et certains ont déjà résolu le problème en ajoutant un unloadable dans la classe concernée
class Toto unloadable end
That’s it !
UPDATE :
En lisant les commentaires en fait ce n’est pas la bonne solution. En fait il faut lire la doc, enfin la doc dans le code 🙂 dans railties/lib/initializer.rb :
# Enables or disables plugin reloading. You can get around this setting per plugin. # If reload_plugins? is false, add this to your plugin's init.rb # to make it reloadable: # # ActiveSupport::Dependencies.load_once_paths.delete lib_path # # If reload_plugins? is true, add this to your plugin's init.rb # to only load it once: # # ActiveSupport::Dependencies.load_once_paths << lib_path #
C’est clair ! soit d’office vous ne voulez pas du tout recharger les plugins (reload_plugin à false), et seulement certains (ceux que vous développez par exemple) alors il faut mettre dans le init.rb :
# config/environments/development.rb config.reload_plugins = false # plugin's init.rb : remove plugin from unloadable list ActiveSupport::Dependencies.load_once_paths -= load_paths
soit l’inverse vous voulez que tous les modules soient rechargeable (reload_plugins à true), sauf certains :
# config/environments/development.rb config.reload_plugins = true # plugin's init.rb : add plugin in unloadable list ActiveSupport::Dependencies.load_once_paths += load_paths