我的用户模型具有通常的id
主键,但它也具有唯一的login
可用作标识符。因此,我想定义路由,以便可以通过ID或登录访问用户。理想的路线是这样的:
/users/:id (GET) => show (:id)
/users/:id (PUT) => update (:id)
...
/users/login/:login (GET) => show (:login)
/users/login/:login (PUT) => update (:login)
...
做到这一点(或类似方法)的最佳方法是什么?
最佳答案
到目前为止,我能想到的最好的方法是:
map.resources :users
map.resources :users_by_login,
:controller => "User",
:only => [:show, :edit, :update, :destroy],
:requirements => {:by_login => true}
通常为用户创建RESTful路由,最重要的是,
users_by_login
资源添加以下路由(仅这些路由):GET /users_by_login/:id/edit
GET /users_by_login/:id/edit.:format
GET /users_by_login/:id
GET /users_by_login/:id.:format
PUT /users_by_login/:id
PUT /users_by_login/:id.:format
DELETE /users_by_login/:id
DELETE /users_by_login/:id.:format
这些路由实际上也映射到
UserController
(仅用于show
/ edit
/ update
/ destroy
方法)。添加了一个额外的by_login
参数(等于true
):这样,UserController
方法可以判断id
参数是登录名还是ID。它可以完成工作,但我希望有更好的方法。