2012-05-20 58 views
1

我有安装引擎的Rails应用程序。从RailsEngine访问应用程序助手

#{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' 为#<#:0x007f9dbf0f7800>” users_path工作在主应用程序视图的罚款。 访问引擎页面时,如何从主应用程序获取路由助手?

+0

我有这个完全一样问题。你有没有找到解决方案? –

+0

更新:对于可安装的引擎来说似乎是不可能的。它只能使用完整的引擎完成(没有独立的命名空间)。请参阅下面的答案。 –

回答

3

铁轨3.2做,这是转换您的发动机进入一个“全”引擎,而不是安装引擎的唯一途径。在可安装的引擎中,引擎不知道主机应用程序,默认情况下它的路径/ url助手不可访问。

This answer解释了需要完成的工作,这对我有用。

另一种方法是遍历宿主应用程序的文件,并将适当的视图/应用程序助手包含到引擎中。它有效,但对我来说,这太麻烦了。简单地转换为一个完整的引擎做了诀窍。

2

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

在配置/ 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

+0

'users_path'已经从主应用程序布局调用(。重写主应用程序不是个好主意,它已经在视图中有数千个帮助程序了。我尝试在主应用程序布局下使用Engine视图(主应用程序帮助程序) – wildDAlex

+0

我明白了,我误解了你的问题,编辑了我的答案以解决这个问题。 – f1sherman

+0

谢谢你的帮助,但我不想从主应用程序访问引擎助手,也不需要引擎主要应用程序助手)。我希望在引擎视图中使用布局时,在主应用布局中获得工作主应用助手。例如。 www.site.com - 主要应用程序 - 工作正常。具有自己的布局的独立引擎也可以正常工作。 www.site.com/talk - 主应用程序布局中的引擎(参见上面的例子)崩溃,错误(。 – wildDAlex

4

我还不知道如何(UN)明智的,这可能是,但刚刚发现以下为可安装/隔离引擎我正在工作:

# 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 

的思考?从发动机的观点我想

+0

不是一个好主意,因为它打破了引擎与应用程序的隔离,这意味着你回到了一个依赖关系的网络上这也意味着你可能无法将引擎提取为宝石,如果你这样做,使用引擎有什么意义? – tmandry

+0

main_app是我一直在寻找的感谢。从发动机得到,所以这是适当的在那里使用main_app,因为视图在应用程序中,但插入到引擎中。 –

1

要访问主要的应用程序助手(ApplicationHelper)包括这样的:

应用程序/佣工/ your_engine/application_helper.rb

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

它的工作原理,但有一次,当我重启dev服务器,它会抛出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 
0

对我来说,我有MyCustomEngineController在我的宝石里面,它继承了ApplicationController,就像这样:

module MyEngine 
    class MyCustomEngineController < ApplicationController 

#... 

我改变了这种继承一点点:

module MyEngine 
    class MyCustomEngineController < ::ApplicationController 

#... 

(通知::ApplicationController之前)

,现在我所有的应用程序的助手可用于我的引擎的看法