Ruby On Rails 3.0 a introduit la possibilité pour les applications basées sur le framework d’être thread safe. Si l’intérêt est limité pour les applications utilisant Ruby 1.8 tant le système de threads nommé green threads est lent, c’est en revanche tout bénéfice pour les utilisateurs de Ruby 1.9.2 puisque cette version utilise les threads natifs du noyau.

Je suis tombé il y a quelques jours sur un bug en lançant une tâches Rake dans l’environnement de production : les modèles de mon application n’étaient visiblement pas chargés, ce qui me provoquait une erreur.

J’ai trouvé la cause de mon problème sur Stack Overflow, mais la solution indiquée dans le thread n’est pas la bonne.

Pour résumer, Rails ne charge pas les dépendances de l’application en production si la variable $railsraketask est définie. Tout se trouve dans le snippet de code ci-dessous :

module Rails
  class Application
    module Finisher
      # ...
      initializer :eager_load! do
        if config.cache_classes && !$rails_rake_task
          ActiveSupport.run_load_hooks(:before_eager_load, self)
          eager_load!
        end
      end
      # ...
    end
  end
end

La solution consiste à ajouter la ligne suivante à la fin de votre fichier config/environments/production.rb :

config.dependency_loading = true if $rails_rake_task  

Cela limitera le chargement des dépendances aux tâches Rake uniquement, et ne génèrera pas de conflits dans l’application elle-même.

Perry the Platypus wants you to subscribe now! Even if you don't visit my site on a regular basis, you can get the latest posts delivered to you for free via Email: