我的主应用程序的应用程序控制器中有一个before_filter钩子,它的作用如下:(它不只是在flash中放置一个链接,还有一个消息,但是与问题无关,它只是访问路由方法)
class ApplicationController < ActionController::Base before_filter :set_link def set_link flash[:notice] = items_path end end
这适用于应用程序,但是当我进入发动机的控制器时,我得到了异常
No route matches {:controller=>"items",:action=>"index"}
我明白,在引擎中,除了main_app的前缀之外,路由助手是引擎
所以将应用程序控制器中的方法更改为
def set_link flash[:notice] = main_app.items_path end
摆脱异常,但我真的不想这样做.是否有另一种解决方案来让引擎识别main_app路由?
编辑:
如果应用程序布局调用路径助手,也会发生这种情况.因此,如果引擎被设计为集成到main_app的布局中,那么这个问题也会在那里产生.
解决方法
可安装引擎设计为这样工作,即隔离主应用程序路由和引擎路由.
如果您想要合并两组路由,则可以使用非隔离引擎.第一步是删除引擎定义中的isolation_namespace方法调用:
module MyEngine class Engine < Rails::Engine isolate_namespace MyEngine # remove this line end end
第二步是在my_engine / config / routes.rb中转换你的路由,你应该从这开始:
MyEngine::Engine.routes.draw do # stuff that routes things end
到这个:
Rails.application.routes.draw do # stuff that routes things end
App::Application.routes.draw do mount MyEngine::Engine => "/engine" # remove this line end
这样做的主要优点是:
>不需要猴子补丁栏.我知道设计这样做,但这可能是从引擎不存在的时代的一个剩下的轨道.
>无需将引擎安装在应用程序路由中.另一方面,如果您想要更精确地控制插入点,那么可能会发生这种情况,因为所有的引擎路由都将被调用(或之前,我没有这个问题的答案)您的主要路由.
如果您正在寻找引擎的文档,那么rails docs for the Engine class是一个很好的起点.如果您对此主题感兴趣,我强烈建议您阅读它们(以防您尚未使用).