从Mountable Engine覆盖主机应用程序的根路由

dhu*_*han 5 ruby-on-rails rails-engines ruby-on-rails-3

我正在编写一个可安装的Rails 3引擎,我将我的引擎路由与主机应用程序相结合.但是,主机应用程序的路由优先于我的引擎路由.有没有办法可以覆盖主机应用程序的路由(特别是根路由)?

这是我的引擎的路线my_enging/config/routes.rb:

MyEngine::Engine.routes.draw do
 root :to => "home#index"
end

# Mount engine routes to host application
Rails.application.routes.draw do
  mount MyEngine::Engine, :at => "/"
end
Run Code Online (Sandbox Code Playgroud)

这是结果rake routes,主持人的根位于顶部:

root  / welcome#index
my_engine  / MyEngine::Engine
root  / home#index
Run Code Online (Sandbox Code Playgroud)

Spree是这样做的一个宝石,但我无法找到他们如何实现这一点.

Nic*_*Roz 0

人们更有可能做相反的事情,所以我不明白为什么你需要这个,因为应该能够覆盖引擎路由。实际上我不知道如何强制引擎覆盖应用程序路由,但是:

我认为 Spree 正在通过eval_block以某种方式动态添加路由。

您可以直接跳过root to:应用程序中所有不需要的路由,然后引擎路由就会出现。不要同时保留它们。我没有看到您的应用程序中指定了 root,但我刚刚运行了一个实验,一切正常!

W12::Engine.routes.draw do
  root to: 'details#index'
end

MyCarsApplication.routes.draw do
  mount Common::Engine => "/"
end
Run Code Online (Sandbox Code Playgroud)

而且只有一条路线:

root / details#index
Run Code Online (Sandbox Code Playgroud)

这篇关于创建非隔离引擎的文章也可能有所帮助。

如果您找到确切答案,请发布。