Может ли консоль Rails перезагружать модули под lib?


У меня есть модуль в моем проекте Rails под lib. Я запускаю "rails c" и делаю некоторые эксперименты в консоли. Я делаю изменения в модуле под lib, введите " перезагрузить!'из консоли, и он не перезагружает файл. Я должен выйти из консоли и перезапустить, что является настоящей болью.

есть ли лучший способ перезагрузить этот файл?

4 59

4 ответа:

попробуйте это:

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

в случае, если кто-то заинтересован, вот мои выводы на Как автоматически перезагрузить файлы require в Rails без перезагрузки сервера.

решение теперь доступно в виде рубинового камня require_reloader.

это monkeypatch, который может помочь вам, вставьте это в консоль rails (или вы можете поместить этот код в файл monkeypatch - хотя я не рекомендую объект monkeypatching с помощью метода утилиты):

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

и вы можете назвать

reload_myself!

на любой объект, чтобы перезагрузить его исходный код.

добавить 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

теперь вы можете перезагрузить все файлы в lib введя reload_lib! в консоли