문제

나는 보석:

# 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 을 위해 다른 행동을 위해 다양한 환경에 적합합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top