2012-03-19 2 views
3

한 손에는 마운트 할 수있는 엔진이 있습니다. 앞면 앞면에는 내 자산과 페이지가 포함되어 있습니다. 메인앱과 격리되어 있습니다. 나는 그것이 메인 애플 리케이션을 만지지 싶지 않아요.레일 prepend_view_path 마운트 할 수있는 엔진

다른 한편으로는 MainApp의 레이아웃과 Front 부분을 사용하고 싶습니다. 그래서 설정 레이아웃이 방법 :

class ApplicationController < ActionController::Base 
    layout 'front/application' 
end 

그러나 앞/응용 프로그램이 있기 때문에 분리의 직접 부분 엔진을 참조하십시오, 그래서이

render 'header' # front/ prefix is not required 

같은 MainApp보기 앱/뷰를로드하려고

class ApplicationController < ActionController::Base 
    layout 'front/application' 
    before_filter :prepend_front 
protected 
    def prepend_front 
     prepend_view_path "app/views/front" 
    end 
end 
:

는이 관념 대신 응용 프로그램/뷰/앞/응용 프로그램/헤더/응용 프로그램/헤더 나는이 같은 prepend_view_path를 넣어

하지만 엔진 경로가 공급 업체를 가리 키기 때문에 작동하지 않습니다. 엔진이 ~/main_app/vendor/private_gems/front-0.0.2/app/views 내 preprend_front 메소드는 ~/main_app/app/views/front를 추가합니다.

나는 힘으로 올바른 경로를 씁니다 tryed (하지만 너무 더러워 보이는) : 나는이 작동하지 않습니다

prepend_view_path "#{Rails.root}/vendor/private_gems/front-0.0.2/app/views/front" 

, 단지

... 응용 프로그램을 충돌 그리고 내가 여기에 붙어있어. 내 디자인이 틀렸나?

답변

0

마지막으로 분리 특성을 제거합니다. 내 뷰를 한 폴더 위로 이동 했으므로 engine_app 폴더에서 이동했습니다.

유일한 최종 수정은 EngineApp :: Engine.url_helper를 MainApp 응용 프로그램 컨트롤러에 포함시키는 것이 었습니다. 이 같은

앞에 추가 스택의 모양을

  • 주요 애플 리케이션, 첨가 된 경로
  • 홈페이지 앱이
  • 엔진 뷰 그래서

이 엔진을 기반을 전망하고 주요 애플 리케이션 물건을 추가 상단에.

1

기본적으로 레일스는 파일의보기 /를 들여다 보지만 찾지 못하면 엔진보기 /를 봅니다. 이것은 뷰 경로를 추가해야만 Rails가 메인 애플리케이션의 뷰/그리고 엔진의 수정 된 경로, 그리고 마지막으로 엔진의 뷰 /를 볼 수 있음을 의미합니다.

  • 주요 응용 프로그램 뷰/(보기/앞/엔진 내부)
  • 엔진 전망
  • 엔진 수정 경로/

이 작업을 수행하려면 application_controller.rb로 이동이 다음 스택 것

class ApplicationController < ActionController::Base 

    before_filter :set_views_path 

    def set_views_path 
     append_view_path FnetIdentityRailsEngine::Engine.root.join('app', 'views', 'front') 
    end 
end 

엔진에서 수정 된 경로를 미리보기 경로 앞에 추가 한 경우 ab 기본 앱에서 엔진보기를 무시하는 기능. 이것이 추가하려는 이유입니다.

+0

실제로 좋은 통찰력. 감사 ;) – ProxyGear

2

Rails 엔진에서이를 수행하려는 경우 (예 : 엔진 자체에 다른로드 경로가 필요한 '테마'가있는 경우)를 제외하고 Jack의 답은 완벽합니다. 이 경우, 엔진 기본로드 경로 이전에 애플리케이션로드 경로 다음에 새로드 경로를 삽입하려고하므로 prepend_path 및 append_path는 적합하지 않습니다.

config.after_initialize do 
    my_engine_root = MyEngine::Engine.root.to_s 
    paths = ActionController::Base.view_paths.collect{|p| p.to_s} 
    paths = paths.insert(paths.index(my_engine_root + '/app/views'), my_engine_root + '/app/views/themes/my_theme') 
    ActionController::Base.view_paths = paths 
end 

my_engine_root + '/app/views/themes/my_theme' 지금 당신의 엔진을하기 전에 될 것입니다 새로운 부하 경로 :

는 이 (전용 레일 3.2에서 테스트)에 대한 해결책은 당신의 엔진 /lib/my_engine.rb 파일에 다음을 추가하는 것입니다

표준로드 경로 my_engine_root + '/app/views'

관련 문제