我有一个模块作为安装发动机安装到主应用程序通过
mount MyEngine::Engine, :at => '/myengine'
在发动机我把一切都命名空间和发动机都有它的发动机/应用/视图/ myengine自己的意见/
一切工作正常,当我运行Rails服务器然后尝试访问
本地主机:3000 / myengine
第一然后进入主应用程序的根,回到发动机通过主应用程序的索引视图链接
然而,当我启动服务器,去为localhost:3000,并从那里点击链接到它试图获取正确的意见,但是包含在发动机的助手方法调用时他们是不确定引发错误的引擎模块上。
我在轨道上4
我用eager_load在它的主要应用程序的初始化加载安装发动机,一切似乎是现在的工作。
Myengine::Engine.eager_load!
我只是碰到了这个问题为好。我已经定义我的发动机内的ApplicationController
并看到NoMethodError
s当我试图用在我的引擎控制器的一个辅助方法。
该代码看起来是这样的:
在my_engine /应用/控制器/ my_engine / application_controller.rb
module MyEngine
class ApplicationController < ActionController::Base
helper ApplicationHelper
end
end
在my_engine /应用/控制器/ my_engine / projects_controller.rb
module MyEngine
class ProjectsController < ApplicationController
def new
# some action code here
end
end
end
在my_engine /应用/助理/ my_engine / application_helper.rb
module MyEngine
module ApplicationHelper
def translations_include_tag
javascript_include_tag "translations-#{I18n.locale}.js"
end
end
end
如果我导航到主机Rails应用程序的路径,然后单击该导航到my_engine /项目/新的,我会得到一个NoMethodError
说translations_include_tag
不存在的链接。
我想,这是怎么回事,因为应用程序有两个类具有相同名称:ApplicationController
在MyEngine
和ApplicationController
在主机应用程序。当参观了发动机之外的第一途径,Rails的自动加载从主机应用程序的ApplicationController
。这也就意味着Rails的主要应用程序的ApplicationController
名为“ApplicationController中”相关联。当您导航到my_engine /项目/新,Rails的延迟加载ProjectsController
这也从ApplicationController
继承。轨道/红宝石想你指的是它已经加载相同ApplicationController
,所以在效果ProjectsController
结束了从主机应用程序的ApplicationController
,而不是一个在发动机继承。由于translations_include_tag
方法不是在主机应用程序的ApplicationController
定义,红宝石当视图试图调用它提出了一个NoMethodError
。
我能够从MyEngine
的ApplicationController
明确继承来解决这个问题:
在my_engine /应用/控制器/ my_engine / projects_controller.rb
module MyEngine
# changed from just plain 'ol ApplicationController
class ProjectsController < ::MyEngine::ApplicationController
def new
# some action code here
end
end
end
固定的继承问题后,NoMethodError
就走了。
该接受的答案说,使用预先加载,这也将解决这个问题,因为它迫使发动机的ApplicationController
首次加载。由于发动机的ApplicationController
是内部MyEngine
命名空间,它的全名是MyEngine :: ApplicationController中,因为不断名不同不与主应用程序的ApplicationController
冲突。
你需要明确在您qazxsw POI文件助手:
lib/engine.rb