RailsEngines 2.3 (suite)

La solution dans l’article précédent ne me plaisait pas, alors j’ai fais ma solution … bon j’avoue j’ai pas cherché s’il existe déjà une solution prête à l’emploi.

Personnellement, je préfère que config. reload_plugins soit à false. Mais je ne veux pas mettre dans mes plugins un bout de code qui dépend plus de l’application et du contexte (development/production) que du plugin lui même.

Je pourrais mettre reload_plugin à true, oui mais je n’ai pas forcément envie de recharger toute la masse de plugin à chaque requête.

Dans un premier temps, on va ajouter une directive de configuration à savoir reloadable_plugins, et on va la traiter au moment du chargement des plugins. Voici le code :

Rails::Configuration.class_eval do
  attr_accessor :reloadable_plugins

  def initialize_with_reloadable_plugins
    initialize_without_reloadable_plugins
    self.reloadable_plugins = default_reloadable_plugins
  end

  def default_reloadable_plugins
    []
  end

  alias_method_chain :initialize, :reloadable_plugins
end

Rails::Plugin::Loader.class_eval do
  def add_plugin_load_paths_with_reloadable_plugins
    load_path = add_plugin_load_paths_without_reloadable_plugins
    plugins.each do |plugin|
      if configuration.reloadable_plugins.include?(plugin.name.to_sym)
        ActiveSupport::Dependencies.load_once_paths -= plugin.load_paths
      end
    end
    load_path
  end
  alias_method_chain :add_plugin_load_paths, :reloadable_plugins
end

qu’on va mettre dans lib/configuration_reloadable_plugins.rb par exemple.

Ensuite ajouter dans le fichier config/environnement.rb, juste après le boot.rb (l’ordre est important)

  ...
require File.join(File.dirname(__FILE__), 'boot')
require File.join(File.dirname(__FILE__), '../vendor/plugins/engines/boot')
require 'lib/configuration_reloadable_plugins'
  ...


Et toujours dans <strong>config/environnement.rb</strong> on indique les plugins à recharger :

...
Rails::Initializer.run do |config|
  config.reloadable_plugins = [ :foo, :bar ]
  config.reload_plugins = false
  ...
end
...

Et pour vérifier que c’est bon :

$ script/console
>> ActiveSupport::Dependencies.load_once_paths.select{ |p| p =~ /foo/ }
=> []
Ce contenu a été publié dans Rails, Web Dev. Vous pouvez le mettre en favoris avec ce permalien.