覆盖Rails 3 Engines提供的命名路由

cbe*_*eer 9 routes ruby-on-rails rails-engines ruby-on-rails-3

我正在使用Rails引擎的Ruby on Rails 3(.0)应用程序.但是,在我的本地应用程序中,我想覆盖Rails引擎提供的其中一个路由.

从引擎config/routes.rb:

match 'their_named_route' => 'controller#action', :as => 'the_route'
Run Code Online (Sandbox Code Playgroud)

从我的应用程序config/routes.rb:

match 'my_named_route' => 'controller#action', :as => 'the_route'
Run Code Online (Sandbox Code Playgroud)

但是,当我检查路线时,两者似乎都是活动的(并且它们的路线似乎"赢",至少在发动机控制器内)

$ rake routes
the_route  /my_named_route(.:format)    {:controller=>"controller", :action=>"action"}
the_route  /their_named_route(.:format) {:controller=>"controller", :action=>"action"}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以强制我的本地应用程序的命名路由优先?

小智 8

我通过将引擎的路由从config/routes.rb移动到引擎类本身的类方法来解决这个问题:

module MyEngine
  class Engine < Rails::Engine
    def self.routes
      MyRailsApp::Application.routes.draw do
        resources :products
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在基本应用程序的路径文件中:

MyRailsApp::Application.routes.draw do
  # Routes for base app including the ones overriding MyEngine::Engine.

  MyEngine::Engine.routes
end
Run Code Online (Sandbox Code Playgroud)

然后,我可以愉快地覆盖基础应用程序中的任何路径与引擎中的路由.

请注意,需要在覆盖路由之前定义覆盖路由,因为先前定义的路由优先于后面的路由.


Rom*_*man 6

我担心没有这么简单的方法.路由是在路由lib/action_dispatch/routing/mapper.rb:271集中定义的,它在路由集上调用add_route(rack-mount-0.6.14/lib/rack/mount/route_set.rb在第71行定义名称附加).没有remove_route方法,最后添加了Engine的路由.使用Rails.application.routes.draw初始化应用程序后,您可以手动添加路由,而不是在routes.rb中使用它,或者您可以修补引擎.