어떻게 받을 중지를 다시 로드하나요?
-
19-09-2019 - |
문제
나는 보석:
# in /Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib/my_gem.rb
module MyGem
def do_stuff
..
end
end
나는 로드에는 레:
# in [rails_root]/config/environment.rb:
config.gem 'my_gem', :version => '1.0.0'
고 그것을 사용:
# in [rails_root]/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
include MyGem
end
하지만 내가 필요로 하는 원숭이-패치 그것은 환경에서 특정 방법:
# in [rails_root]/config/environments/development.rb:
MyGem.class_eval do
def do_stuff
raise 'Ack! - just testing'
end
end
불행하게도, MyGem
이드시에 모든 요청,그래서 내 원숭이 깁는 것은 쓸모가 없다.
나는 확인 load_once_paths
:
ActiveSupport::Dependencies.load_once_paths
# => ["/Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib", "other stuff"]
어떤 아이디어는 어떻게 얻을 수 있는 효과를 내가 원하는가?
해결책
은 작업에서 개발이드 레일 로드에 있는 모든 클래스는 모든 요청을 도와 개발자를 반영하는 코드 변경+당신이 포함되어 있는 보석에서 컨트롤러입니다.이것을 극복하기 위하여 가 project_path/config/환경/개발.rb 과이 줄을 추가
config.cache_classes = true
알 수가 없습니다 당신의 코드 변경을 반영하지 않는 한 당신은 서버를 다시 시작합니다.
Update1:또한 두 번째 솔루션을 추가할 수 있습니다 페리와 패치한 후에 당신은 당신이 포함석에서는 컨트롤러입니다.추가 할 수 있습니다 하단의 컨트롤러 파일입니다.
업데이트 2:세 번째 솔루션 (권장) 할 수 있는 경우 다음 코드를 추가하 my_gem.rb
class ActionController::Base
include MyGem
end
그런 일이 있어야 합니다 당신이 필요하지 않을 수동으로 포함 응용 프로그램에서 컨트롤러입니다.
다른 팁
만약 당신이 등에서 보석 h environment.rb
당신이 필요가 없에 포함 컨트롤러입니다.
할 수 있는 방법에 대해 생각하는 보석으로 후크 ActionController-그것은 당신 같은 소리를 추가하려는 클래스 메소드를 ActionController::베이스는 매우 간단합니다.어떻게 많은 일반적인 보석이 구현.
그것은 너무 소리처럼,당신도 원한이 있는지 여부를 확인 하&의 가치 RAILS_ENV
을 위해 다른 행동을 위해 다양한 환경에 적합합니다.