web-dev-qa-db-fra.com

La console Rails peut-elle recharger des modules sous lib?

J'ai un module dans mon projet Rails sous lib. Je lance 'Rails c' et fais des expériences dans la console. Je modifie le module sous lib, tapez 'reload!' à partir de la console et il ne recharge pas le fichier. Je dois quitter la console et redémarrer, ce qui est très pénible.

Existe-t-il un meilleur moyen de recharger ce fichier?

61
Chip Castle

Essaye ça:

load "#{Rails.root}/lib/yourfile.rb"
151
NullRef

Au cas où cela intéresserait, voici mes conclusions sur comment recharger automatiquement les fichiers requis dans Rails sans redémarrer le serveur. 

La solution est maintenant disponible sous forme de gem Ruby require_reloader .

2
Huiming Teo

Ajouter ce qui suit à config/initializers/reload.rb

class Object
  def reload_lib!
    Dir["#{Rails.root}/lib/**/*.rb"].map { |f| [f, load(f) ] } #.all? { |a| a[1] } 
    # uncomment above if you don't want to see all the reloaded files
  end
end

Vous pouvez maintenant recharger tous les fichiers dans lib en tapant reload_lib! dans la console.

0
Abdo

ceci est le monkeypatch qui pourrait vous aider, collez-le dans la console Rails (ou vous pouvez mettre ce code dans un fichier monkeypatch - bien que je ne recommande pas monkeypatching Object avec une méthode utilitaire):

class Object
  def self.reload_myself!
    method = (self.instance_methods(false) + self.methods(false)).select{|method| method.to_s[0] =~ /[A-Za-z]/}.last
    if method
      if self.instance_methods(false).index method
        method = self.instance_method(method)
      elsif
        method =  self.method(method)
      end

      if (method.source_location)
        source_location = method.source_location[0]
        puts "reloading: #{source_location}"
        load "#{source_location}"
      else
        puts "could not reload #{self.name}"
      end
    end
  end
end

et vous pouvez appeler 

reload_myself!

sur n'importe quel objet pour recharger son code source.

0
Wouter Vegter