这个答案的原始形式有很大的不同,可以在这里找到。只需证明有多种方法可以给猫剥皮。
从那以后,我已经更新了答案,以使用名称空间并使用301重定向-而不是默认的302。感谢pixeltrix和Bo Jeanes提示这些问题。
你可能想穿真正强大的头盔,因为这会打击你的想法。
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版只是一个很小的有点不同。而不是Api::V1::UsersController
现在为它服务的控制器,现在是Api::V2::UsersController
。您可以通过发出以下请求来到达那里/api/v2/users
。
接下来,使用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>
或/api/<version>/<resource>
?
无论如何,这很有趣,希望对您有所帮助!