ruby-on-rails-3 – 应用控制器中的引擎路由

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-3 – 应用控制器中的引擎路由前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的主应用程序的应用程序控制器中有一个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是一个很好的起点.如果您对此主题感兴趣,我强烈建议您阅读它们(以防您尚未使用).

原文链接:https://www.f2er.com/ruby/271946.html

猜你在找的Ruby相关文章