需要补充几点:
你的重定向匹配无法适用于某些路由 - *api
参数是贪婪的,会吞噬一切,例如/api/asdf/users/1
将重定向到/api/v2/1
。最好使用一个正则参数,比如:api
。尽管它无法匹配像/api/asdf/asdf/users/1
这样的情况,但如果您的API中有嵌套资源,则它是更好的解决方案。
Ryan,为什么你不喜欢namespace
?例如:
current_api_routes = lambda do
resources :users
end
namespace :api do
scope :module => :v2, ¤t_api_routes
namespace :v2, ¤t_api_routes
namespace :v1, ¤t_api_routes
match ":api/*path", :to => redirect("/api/v2/%{path}")
end
这种方式具有版本化和通用命名路由的额外优势。另外需要注意的是,当使用:module
时,惯例是使用下划线表示法,例如:api/v1
而不是 'Api::V1'。曾经有一段时间后者无法使用,但我相信在Rails 3.1中已经修复了。
另外,当你发布API的v3版本时,路由将会像这样更新:
current_api_routes = lambda do
resources :users
end
namespace :api do
scope :module => :v3, ¤t_api_routes
namespace :v3, ¤t_api_routes
namespace :v2, ¤t_api_routes
namespace :v1, ¤t_api_routes
match ":api/*path", :to => redirect("/api/v3/%{path}")
end
当然,你的API在不同版本之间可能会有不同的路由,这种情况下,你可以这样做:
current_api_routes = lambda do
end
namespace :api do
scope :module => :v3, ¤t_api_routes
namespace :v3, ¤t_api_routes
namespace :v2 do
end
namespace :v1 do
end
match ":api/*path", :to => redirect("/api/v3/%{path}")
end