这个答案的原始形式有很大不同,可以在这里找到 https://stackoverflow.com/revisions/9627796/2。只是证明剥猫皮的方法不止一种。
我已经更新了答案,因为使用命名空间并使用 301 重定向——而不是默认的 302。感谢 Pixeltrix 和 Bo Jeanes 对这些事情的提示。
你可能想穿really坚固的头盔,因为这将意乱情迷.
Rails 3 路由 API 非常邪恶。要根据上述要求为您的 API 编写路由,您只需要这样:
namespace :api do
namespace :v1 do
resources :users
end
namespace :v2 do
resources :users
end
match 'v:api/*path', :to => redirect("/api/v2/%{path}")
match '*path', :to => redirect("/api/v2/%{path}")
end
如果您的思想在此之后仍然完好无损,请让我解释一下。
首先,我们调用namespace
当您想要将一堆路由范围限定为类似名称的特定路径和模块时,这非常方便。在这种情况下,我们希望我们的块内的所有路线namespace
范围内的控制器Api
模块和对该路由内的路径的所有请求都将带有前缀api
。请求如/api/v2/users
,你知道吗?
在命名空间内,我们又定义了两个命名空间(哇!)。这次我们定义了“v1”命名空间,因此这里控制器的所有路由都将位于V1
模块内的Api
模块:Api::V1
。通过定义resources :users
在此路线内,控制器将位于Api::V1::UsersController
。这是版本 1,您可以通过发出如下请求来到达该版本/api/v1/users
.
版本 2 只是一个tiny有点不同。而不是服务它的控制器位于Api::V1::UsersController
,现在是在Api::V2::UsersController
。你可以通过提出如下请求来到达那里/api/v2/users
.
Next, a match
用来。这将匹配所有 API 路由,例如/api/v3/users
.
这是我必须查找的部分。这:to =>
选项允许您指定应将特定请求重定向到其他地方 - 我知道这么多 - 但我不知道如何让它重定向到其他地方并随它一起传递原始请求的一部分。
为此,我们调用redirect
方法并向其传递一个带有特殊插值的字符串%{path}
范围。当收到与此最终匹配的请求时match
,它将插入path
参数到的位置%{path}
在字符串内并将用户重定向到他们需要去的地方。
最后我们用另一个match
路由所有剩余的前缀为/api
并将它们重定向到/api/v2/%{path}
。这意味着像这样的请求/api/users
将会去/api/v2/users
.
我不知道如何获得/api/asdf/users
匹配,因为你如何确定这是否应该是一个请求/api/<resource>/<identifier>
or /api/<version>/<resource>
?