2012-02-10 8 views
22

アプリケーションに一般的な機能(フォトギャラリー)を提供するために、単純なRailsエンジンを作成しました。ギャラリーのメニューとメインアプリケーションのメニューが一致するように標準の_headerの部分をオーバーライドできるようにしたい。私のヘッダービューでは、私はapplication_helpers(メインアプリケーション)の一部であるヘルパーを呼び出しますが、私は "未定義のメソッド"エラーを取得し続けます。私がメインアプリケーションに伝えることから、アプリケーションアプリケーションのレイアウトやその一部をオーバーライドすると、明らかにapplication_helpersがインクルードされていません。Railsエンジンの表示/レイアウトをオーバーライドするときにメインアプリケーションのヘルパーにアクセスする

私の質問は、メインアプリケーションのエンジンビューをオーバーライドし、メインのアプリケーションヘルパーメソッドにアクセスする方法です。私はまだエンジンヘルパーにアクセスする必要があり、エンジン機能を台無しにしないでください。

コントローラーをオーバーライドする必要がありますか?いくつかのヘルパーを得るためにたくさんのように思える。

おかげ

のRails 3.1.3

+5

あなたは 'main_app.your_helper_method'を試みたことがありますか? – glebm

+0

この[質問](http://stackoverflow.com/questions/10879150/isolated-engine-doorkeeper-use-helper-methods-from-the-main-app)に記載されている方法をお試しください。コントローラをオーバーライドしてください – Matt

答えて

1

エンジンヘルパー・メソッドをオーバーライドするために、あなたのエンジンでは、ヘルパーの同じ名前を持つアプリケーションでヘルパーを作成してみてください。

私はthis discussionが特に洞察力があると分かりました。また、Rails Engine API docsには興味深いアイデアがあります。の下には、孤立したエンジンヘルパーがあります。

+0

Rails Engine APIドキュメントは、url_helpersの良い解決策を見つけ出すのに役立ちました!ありがとう。 –

2

メインのアプリヘルパーメソッドを含めてみてください。例:

この場合、Railsが正しく検索することが期待されますが、ファイルを最初に要求する必要があります。

ApplicationHelperが含まれると、コントローラでこれらのヘルパーを直接使用できるはずです。

また、たくさんのRailsクラスに対してClassName.helper("application")を呼び出すことができます。ここでうまくいくかどうかはわかりません。

0

免責事項:私はこのソリューションをRails 3.2エンジンでのみ使用しました。

エンジンに標準ヘッダーの部分ベンダー/ gems/my_gallery_engine/app/views/application/_header.html.erbがある場合。

次に、カスタマイズした部分app/views/application/_header.html.erbを作成して、メインアプリでオーバーライドします。 Railsのロード順にエンジンアプリ/ビューを検索し、その後アプリ/ビューディレクトリ(デフォルト)ビューテンプレートの検索パスは、メインのアプリで始まり、およびので

オーバーライド機能します。

メインアプリのヘルパーはすべて、部分的に利用できます。

1

エンジンはメインアプリから独立していると思われます。そのため、エンジンからヘルパーにアクセスすることはできません。

ただし、エンジンにメインアプリのヘルパーにアクセスできるようにするためのハッキング方法があります。これは私がそれをやった方法です:あなたは、あなたのエンジンクラスの実際の名前にPhotoGalleryを変更することはもちろん必要

# In the main app 
# initializers/share_helpers_path_with_engine.rb 
PhotoGallery::Engine.class_eval do 
    paths["app/helpers"] << File.join(File.dirname(__FILE__), '../..', 'app/helpers') 
end 

は、エンジンのドキュメント(パスに関するセクション)を見てお気軽に:http://edgeapi.rubyonrails.org/classes/Rails/Engine.html

3

チェックアウトこのブログ記事を:http://www.candland.net/2012/04/17/rails-routes-used-in-an-isolated-engine/ 著者は親にアクセスするために、アプリケーションヘルパーにmethod_missingの定義を追加しますアプリケーションのヘルパー。

/config/initializers/blogit.rb

module Blogit 
    module ApplicationHelper 
     def method_missing method, *args, &block 
     puts "LOOKING FOR ROUTES #{method}" 
     if method.to_s.end_with?('_path') or method.to_s.end_with?('_url') 
      if main_app.respond_to?(method) 
      main_app.send(method, *args) 
      else 
      super 
      end 
     else 
      super 
     end 
     end 

     def respond_to?(method) 
     if method.to_s.end_with?('_path') or method.to_s.end_with?('_url') 
      if main_app.respond_to?(method) 
      true 
      else 
      super 
      end 
     else 
      super 
     end 
     end 
    end 
    end 
+1

これはちょうど私が必要としていた '_path'と' _url'ヘルパーを追加します。しかし、より良い解決策があります。 'helper Rails.application.routes.url_helpers'をエンジンの' ApplicationController'に追加してください。リンクされたブログ記事に関する私のコメントを参照してください。 –

+0

OPの場合、おそらく 'helper Rails.application.helpers'と同じテクニックを使うことができます。 –

関連する問題