是否有办法在Rails 3中删除gem中指定的路由?异常记录器gem指定了我不想要的路由。我需要像这样指定路由上的约束:
scope :constraints => {:subdomain => 'secure', :protocol => 'https'} do
collection do
post :query
post :destroy_all
get :feed
end
end
基于Rails引擎文档,我想我可以创建一个monkey补丁,并添加一个没有指定路由的路由文件到路径["config/routes"]。路径数组,但文件不会被添加到ExceptionLogger::Engine.paths["config/routes"]。路径
File: config/initializers/exception_logger_hacks.rb
ExceptionLogger::Engine.paths["config/routes"].paths.unshift(File.expand_path(File.join(File.dirname(__FILE__), "exception_logger_routes.rb")))
我错了吗?也许有更好的方法?
可以阻止Rails加载特定gem的路由,这样就不会添加任何gem路由,所以你必须手动添加你想要的路由:
在应用程序中添加初始化器。像这样:
class Application < Rails::Application
...
initializer "myinitializer", :after => "add_routing_paths" do |app|
app.routes_reloader.paths.delete_if{ |path| path.include?("NAME_OF_GEM_GOES_HERE") }
end
有一种方法对我很有效。
它不会"删除"路由,但可以让你控制它们匹配的位置。你可能希望每个请求的路由都匹配一些东西,即使它是底部的404。
你的应用程序路由(MyApp/config/routes.rb)将首先被加载(除非你修改了默认的加载过程)。首先匹配的路由优先。
所以你可以明确地重新定义你想要阻止的路由,或者在YourApp/config/routes的底部使用catch all路由来阻止它们。rb文件。
不幸的是,命名路由似乎遵循ruby的"最后一个定义获胜"规则。因此,如果路由被命名了,而你的应用或引擎使用了这些名称,你需要首先定义路由(这样你的路由就会首先匹配),然后最后定义路由(这样命名的路由指向的是你想要的,而不是引擎定义的) 要在引擎添加路由后重新定义它们,请创建一个名为 的文件# config/named_routes_overrides.rb
Rails.application.routes.draw do
# put your named routes here, which you also included in config/routes.rb
end
# config/application.rb
class Application < Rails::Application
# ...
initializer 'add named route overrides' do |app|
app.routes_reloader.paths << File.expand_path('../named_routes_overrides.rb',__FILE__)
# this seems to cause these extra routes to be loaded last, so they will define named routes last.
end
end
你可以在控制台中测试这个路由三明治:
> Rails.application.routes.url_helpers.my_named_route_path
=> # before your fix, this will be the engine's named route, since it was defined last.
> Rails.application.routes.recognize_path("/route/you/want/to/stop/gem/from/controlling")
=> # before your fix, this will route to the controller and method you defined, rather than what the engine defined, because your route comes first.
修复后,这些调用应该相互匹配。
(我最初在这里的炼油厂宝石谷歌组:https://groups.google.com/forum/?fromgroups#!topic/refinery-cms/N5F-Insm9co)