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)我收到错误“未定义的方法 `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

如果您想从主应用程序访问引擎助手,您可以使用您在安装应用程序时为应用程序创建的名称。

在主应用程序的 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 回答
2

要从我尝试的引擎视图访问主应用程序助手(ApplicationHelper),包括:

app/helpers/your_engine/application_helper.rb

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

它可以工作,但是有一次,当我重新启动开发服务器时,它会抛出 me 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 回答
1

在我的情况下,我MyCustomEngineController在我的宝石里面,它继承了ApplicationController,像这样:

module MyEngine
  class MyCustomEngineController < ApplicationController

#...

我稍微改变了这个继承:

module MyEngine
  class MyCustomEngineController < ::ApplicationController

#...

::(提前通知ApplicationController

现在我的所有应用程序的助手都可用于我的引擎视图

于 2018-02-01T09:20:33.737 回答