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)
然后,我可以愉快地覆盖基础应用程序中的任何路径与引擎中的路由.
请注意,需要在覆盖路由之前定义覆盖路由,因为先前定义的路由优先于后面的路由.
我担心没有这么简单的方法.路由是在路由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中使用它,或者您可以修补引擎.
| 归档时间: |
|
| 查看次数: |
5645 次 |
| 最近记录: |