5

我有一个Rails应用程序,我试图将Rails引擎集成到。如何覆盖引擎的Rails应用程序路线?

主机应用程序有一些赶上所有路线:

# magic urls 
    match '/' => 'admin/rendering#show' 
    match '*path/edit' => 'admin/rendering#show', :defaults => { :editing => true } 
    match '*path' => 'admin/rendering#show' 

它看起来像应用程序捕获所有路线后的发动机路线被加载。

/sitemap.xml(.:format)           {:format=>"xml", :controller=>"admin/sitemaps", :action=>"show"} 
           /(.:format)              {:controller=>"admin/rendering", :action=>"show"} 
           /*path/edit(.:format)            {:controller=>"admin/rendering", :action=>"show"} 
           /*path               {:controller=>"admin/rendering", :action=>"show"} 
      engine_envs GET /engine/envs/:id(.:format)          {:controller=>"engine/envs", :action=>"show"} 
         PUT /engine/envs/:id(.:format)          {:controller=>"engine/envs", :action=>"update"} 
       jammit  /assets/:package.:extension(.:format)        {:extension=>/.+/, :controller=>"jammit", :action=>"package"} 

到目前为止,一切都打到/engine/envs路线越来越被应用程序捕获捕获所有路线。但是我发现发动机后装载了发动机,我不相信这些发动机会被抓到。任何方式来覆盖应用程序路线?

回答

1

你可以坚持你的引擎路线的方法,然后调用,在你的主机应用程序。

# engine routes.rb 
module ActionDispatch::Routing 
    class Mapper 
    def engine_routes 
     engine_envs GET /engine/envs/:id(.:format) 
     # ... 
    end 
# ... 

然后在您的主机应用程序中添加该方法之前的捕获所有的rou te

# host app routes.rb 
MyTestApp::Application.routes.draw do 
    # ... 

    engine_routes 

    match '/' => 'admin/rendering#show' 
    match '*path/edit' => 'admin/rendering#show', :defaults => { :editing => true } 
    match '*path' => 'admin/rendering#show' 
end 
0

路由按其定义的顺序使用。要读取的第一个路由是主机应用程序之一,然后是您的引擎。

只要找到匹配的路线,就停止搜索路线。

据我所知,有没有办法(我可能是错关于这一点)来覆盖除了改变你的这个功能“MAG

更新:所以这意味着,为了你看到他们在”耙路线”是他们的处理顺序。只要匹配的路由时,你去那里。