轨从主应用程序路由时没有发现安装的发动机辅助方法

问题描述 投票:0回答:3

我有一个模块作为安装发动机安装到主应用程序通过

mount MyEngine::Engine, :at => '/myengine'

在发动机我把一切都命名空间和发动机都有它的发动机/应用/视图/ myengine自己的意见/

一切工作正常,当我运行Rails服务器然后尝试访问

本地主机:3000 / myengine

第一然后进入主应用程序的根,回到发动机通过主应用程序的索引视图链接

然而,当我启动服务器,去为localhost:3000,并从那里点击链接到它试图获取正确的意见,但是包含在发动机的助手方法调用时他们是不确定引发错误的引擎模块上。

我在轨道上4

ruby-on-rails ruby rails-engines
3个回答
1
投票

我用eager_load在它的主要应用程序的初始化加载安装发动机,一切似乎是现在的工作。

Myengine::Engine.eager_load!


1
投票

我只是碰到了这个问题为好。我已经定义我的发动机内的ApplicationController并看到NoMethodErrors当我试图用在我的引擎控制器的一个辅助方法。

The Problem

该代码看起来是这样的:

在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 /项目/新的,我会得到一个NoMethodErrortranslations_include_tag不存在的链接。

The Explanation

我想,这是怎么回事,因为应用程序有两个类具有相同名称:ApplicationControllerMyEngineApplicationController在主机应用程序。当参观了发动机之外的第一途径,Rails的自动加载从主机应用程序的ApplicationController。这也就意味着Rails的主要应用程序的ApplicationController名为“ApplicationController中”相关联。当您导航到my_engine /项目/新,Rails的延迟加载ProjectsController这也从ApplicationController继承。轨道/红宝石想你指的是它已经加载相同ApplicationController,所以在效果ProjectsController结束了从主机应用程序的ApplicationController,而不是一个在发动机继承。由于translations_include_tag方法不是在主机应用程序的ApplicationController定义,红宝石当视图试图调用它提出了一个NoMethodError

The Solution

我能够从MyEngineApplicationController明确继承来解决这个问题:

在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冲突。


0
投票

你需要明确在您qazxsw POI文件助手:

lib/engine.rb
© www.soinside.com 2019 - 2024. All rights reserved.