1

エンジンがマウントされたRailsアプリケーションがあります。

#{main_app}/config/routes.rb
mount CommentIt::Engine => "/talk", :as => 'comment_it'

また、メイン アプリケーション レイアウト内でエンジン ビューを開きたい。

#{main_app}/app/views/layouts/application.html.erb
<html>
  <body>
    <%= link_to "users", users_path %>
    <%= yield %>
  </body>
</html>

エンジン ビュー (0.0.0.0:3000/talk) にアクセスすると、エラー'undefined method `users_path' for #<#:0x007f9dbf0f7800>'が表示されました' users_path はメイン アプリケーション ビューで正常に動作します。エンジン ページにアクセスするときに、メイン アプリケーションからルート ヘルパーを取得するにはどうすればよいですか?

4

5 に答える 5

4

これがどのように(不)賢明であるかはまだわかりませんが、私が取り組んでいるマウント可能な/分離されたエンジンで次のことが機能することがわかりました。

# in app/helpers/my_engine/application_helper.rb
module MyEngine
  module ApplicationHelper
    def method_missing(method, *args, &block)
      main_app.send(method, *args, &block)
    rescue NoMethodError
      super
    end
  end
end

考え?

于 2012-10-15T07:39:33.340 に答える
3

Rails 3.2 では、これを行う唯一の方法は、エンジンをマウント可能なエンジンではなく、「フル」エンジンに変換することです。マウント可能なエンジンでは、エンジンはホスト アプリケーションを認識せず、デフォルトではそのパス/URL ヘルパーにアクセスできません。

この回答は、何をする必要があるかを説明しており、私にとってはうまくいきました。

別の方法は、ホスト アプリケーションのファイルを走査し、適切なビュー/アプリケーション ヘルパーをエンジンに含めることです。それは機能しますが、私にとっては面倒でした。完全なエンジンに変換するだけでうまくいきました。

于 2012-06-19T12:30:58.833 に答える
2

私が試したエンジンのビューからメインアプリヘルパー(ApplicationHelper)にアクセスするには、これを含めます:

app/helpers/your_engine/application_helper.rb

module YourEngine
  module ApplicationHelper
    include ActionView::Helpers::ApplicationHelper
  end
end

動作しますが、一度、開発サーバーを再起動するとスローされますuninitialized constant ActionView::Helpers::ApplicationHelperが、この例外を再現できません。

編集

これを削除して、これincludeを作成しました:

lib/my_engine/engine.rb (エンジン内にあります)

module MyEngine
  class Engine < ::Rails::Engine
    isolate_namespace MyEngine
    config.to_prepare do
      ApplicationController.helper(ActionView::Helpers::ApplicationHelper)
    end
  end
end
于 2014-02-15T00:47:12.760 に答える
2

メイン アプリケーションからエンジン ヘルパーにアクセスする場合は、アプリをマウントしたときに作成した名前を使用できます。

メインアプリケーションの config/routes.rb で:

MyApplication::Application.routes.draw do
  mount MyEngine::Engine => "/some_engine", :as => "some_engine"
  get "/path_i_want_to_reference_from_main_app" => "some_controller#some_action"
end

メイン アプリケーション コントローラー/ビューの内部:

some_engine.path_i_want_to_reference_from_main_app_path

したがって、あなたの場合は次を使用します:

<%= link_to "users", comment_it.users_path %>

エンジンからメイン アプリケーション ヘルパーにアクセスする場合は、試してください。main_app.users_path

http://edgeapi.rubyonrails.org/classes/Rails/Engine.html

于 2012-05-20T17:25:25.640 に答える
1

私の場合、次のようMyCustomEngineControllerに継承された宝石の中にありました:ApplicationController

module MyEngine
  class MyCustomEngineController < ApplicationController

#...

私はこの継承を少し変更しました:

module MyEngine
  class MyCustomEngineController < ::ApplicationController

#...

::(事前にお知らせApplicationController)

これで、すべてのアプリのヘルパーがエンジンのビューで利用できるようになりました

于 2018-02-01T09:20:33.737 に答える