Program Tip

Rails 콘솔이 lib에서 모듈을 다시로드 할 수 있습니까?

programtip 2020. 11. 26. 19:46
반응형

Rails 콘솔이 lib에서 모듈을 다시로드 할 수 있습니까?


내 Rails 프로젝트의 lib 아래에 모듈이 있습니다. 'rails c'를 실행하고 콘솔에서 몇 가지 실험을합니다. lib 아래의 모듈을 변경하고 'reload!'를 입력합니다. 콘솔에서 파일을 다시로드하지 않습니다. 콘솔을 종료하고 다시 시작해야합니다. 정말 고통 스럽습니다.

해당 파일을 다시로드하는 더 좋은 방법이 있습니까?


이 시도:

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

관심있는 사람을 위해, 여기에 서버를 다시 시작하지 않고 Rails에서 파일을 자동으로 다시로드하는 방법대한 내 발견이 있습니다.

이 솔루션은 이제 Ruby gem require_reloader로 제공 됩니다.


이것은 여러분을 도울 수있는 monkeypatch입니다. 이것을 rails 콘솔에 붙여 넣으십시오 (또는이 코드를 monkeypatch 파일에 넣을 수 있습니다-유틸리티 메소드로 monkeypatching Object를 권장하지는 않습니다).

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!

참고 URL : https://stackoverflow.com/questions/6361401/can-rails-console-reload-modules-under-lib

반응형