2012-03-19 8 views
3

一方で、マウント可能なエンジンがあります。フロント フロントには私の資産とページのカップルが含まれています MainAppから隔離されています。私はそれがメインアプリに触れないようにしたい。rails prepend_view_pathマウント可能なエンジン

一方、私はMainAppがレイアウトとFrontの一部を使って欲しいです。 だから私のセットアップレイアウトこの方法:

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

しかし、フロント/アプリケーションが原因で隔離のため、直接部分エンジンを参照して、だから、この

render 'header' # front/ prefix is not required 

ようMainAppにビューがアプリ/ビューをロードしよう代わりに、アプリ/ビュー/フロント/アプリケーション/ヘッダの/アプリケーション/ヘッダ

これをFIXEするために、私はこのようなprepend_view_pathを置く:

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

エンジンパスがベンダーを指しているため、これは機能しません。 エンジンが先頭に追加パスリストに自己これを追加します。〜/ main_app /ベンダー/ private_gems /フロント-0.0.2 /アプリ/ビュー そして、私のpreprend_front方法は、これを作成します。フロント〜/ main_app /アプリ/ビュー/

は私が力で正しいパスを付加するためにしようと試みた(しかし、それはとても汚れて見えます):私は動作しません

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

、ちょうど

...アプリをクラッシュそして、私はここにこだわっています。多分私のデザインは間違っていますか?

答えて

0

最後に、分離プロパティを削除します。 私はビューを1つ上に移動しました。そのため、engine_appフォルダから外しました。

唯一の最終的な修正は、EngineApp :: Engine.url_helperをMainAppアプリケーションコントローラに組み込むことでした。

先頭に追加スタックは次のようになります。

  • メインアプリの先頭に追加パス
  • 主なアプリケーションは、だから、それはエンジンに基づいています
  • エンジンビュー
  • は、メインアプリのものを追加見て

      を頂上で。

    1

    デフォルトでは、Railsはビュー/ファイルを探しますが、見つからない場合はエンジンのビュー/を見ます。これは、ビューのパスを追加して、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は適切ではありません。

    これに対する解決策は、(唯一のRails 3.2でテスト)あなたのエンジン/lib/my_engine.rbファイルに以下を追加することです:

    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'は今ちょうどあなたのエンジンの前になります標準ロードパスmy_engine_root + '/app/views'

    関連する問題