2009-09-07 3 views
0

레일스 플러그인을 작성하고 있습니다 (Foo라고 부름). 나는 내가 할 수 있도록이, '바'컨트롤러에 클래스 기능을 제공 할 :레일즈 플러그인에서 ActionController를 올바르게 확장하는 방법

class ApplicationController 
    bar ... 
end 

bar는 플러그인 로딩 파일 공급 업체/플러그인/foo는/init.rb withing에에서 정의된다.

class ActionController::Base 
    def self.bar 
    ... 
    end 
end 

문제와 같은 뭔가 (내 경우 ResourceController에서) 다른 플러그인 전에 foo는 액세스와 ApplicationController를로드 할 수 있다는 것입니다.

그래서 'bar'가 정의되지 않았기 때문에 ApplicationController가 'foo'플러그인 앞에로드되고 YET으로 정의됩니다.

그래서 ... 어떻게해야합니까 제대로 작동하게합니까?

ActionController (예 : inherited_resources, resource_controller)를 확장하는 다른 많은 플러그인이 정확히 똑같은 것을 알게되었으므로 누가 실패했거나 작동하는지 결정하기 위해 누가 먼저로드 할 것인가가 중요합니다.

일부 모듈에 코드를 넣고 'foo'를 호출하기 전에 모듈을 ApplicationController 코드에 수동으로 추가 할 수 있다는 것을 알고 있습니다. 나는 차라리, 나는 'foo'의 청결 함을 좋아한다.

또한 '필요'설명서를 원하지 않습니다. 플러그인은 자동로드 스스로 모든 :

답변

1

은 무엇 당신이 가진 것은 고전 플러그인로드 순서 문제입니다. Ryan Daigle은 2007 년에 nice article을 가지고있었습니다. 여기에 권장 사항을 요약 해 드리겠습니다.

# in RAILS_ROOT/config/environment.rb: 
... 
Rails::Initializer.run do |config| 
    # load Bar before Foo, then everything else: 
    config.plugins = [ :bar, :foo, :all ] 
    ... 
end 
0

, 내가 이해에서

ResourceController 부하 foo 플러그인 전에 있어야하고 foo에 정의 된 bar 방법을 사용하려고합니다. 일반적으로 보석 및 플러그인은 응용 프로그램 클래스보다 먼저로드됩니다. (rails/railties/lib/initializer.rb을보십시오). 오류를 추적 할 수 있도록 스택 추적을 제공 할 수 있습니까?

또한, 클래스를 확장하기위한이 나에게 더 나은 대안을 보인다

module ActionController 
    class Base 
    class << self 
     ... # Class methods here 
    end 
    ... # Instance methods here 
    end 
end 
+0

아니요. ResourceController는 foo를 참조하는 ApplicationController를 참조합니다. 하지만 "bar"는 플러그인 "foo"가 ResourceController 이후에로드 된 이후로로드되지 않았습니다. –

관련 문제