2009-03-02 19 views
4

我的用戶模型具有常用的id主鍵,但它也有一個可用作標識符的唯一login。因此,我想定義路由,以便用戶可以通過ID或登錄進行訪問。理想情況下,路線將是這樣的:如何在Rails中爲具有多個關鍵字段的資源定義RESTful路由?

/users/:id (GET) => show (:id) 
/users/:id (PUT) => update (:id) 
... 

/users/login/:login (GET) => show (:login) 
/users/login/:login (PUT) => update (:login) 
... 

這樣做(或類似的)的最佳方法是什麼?

回答

0

不完全確定你在這裏做什麼,但這可能有一些幫助。

您可以通過添加:member or :collection選項來定義軌道提供的自動RESTful路由之外的操作。

map.resources :users, :member => { :login => [:post, :get] } 

這將產生看起來像這樣的路線:

/users/:id (GET) 
... 
/users/:id/login (GET) 
/users/:id/login (POST) 

你可以做的只是使用的登錄與您查找的屬性的另一件事(假設它是唯一的)。退房Ryan Bates screencast就可以了。在你的控制器,你將有:

def show 
@user = User.find_by_login(params[:id]) 
... 
end 

他還有另一個screencast,可以幫助你。第二個講述自定義命名路線。

+0

嗨vrish88,謝謝您的回答。對不起,我的問題還不夠清楚。我只是編輯它使其更清晰(我希望)。我同時找到了一個可能的解決方案(見下文)。這不是很好,所以我希望有人知道更好的方法。 – MiniQuark 2009-03-03 01:49:30

1

到目前爲止,我能想出的最好的是這樣的:

map.resources :users 

map.resources :users_by_login, 
    :controller => "User", 
    :only => [:show, :edit, :update, :destroy], 
    :requirements => {:by_login => true} 

爲用戶創建通常的REST風格的路線,最重要的是,該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。

它可以完成這項工作,但我希望有更好的方法。

1

只需檢查傳遞給控制器​​方法的ID是否爲整數。

if params[:id].is_a?(Integer) 
    @user = User.find params[:id] 
else 
    @user = User.find_by_login params[:id] 

無需添加特殊路線。

+0

我想到了這一點,但不幸的是,我們確實有用戶的登錄是一個整數! – MiniQuark 2009-03-03 04:43:48

1

其實凱爾文恩在這裏有正確的想法。但它略微偏離。當params變量出現時,所有的值都以字符串形式存儲,所以他的示例每次都會返回false。你可以做的是這樣的:如果

if params[:id].to_i.zero? 
@user = User.find_by_login params[:id] 
else 
@user = User.find params[:id] 
end 

這樣的:ID是一個實際的串紅寶石只是其轉換爲0。您可以通過使用紅寶石調試寶石在params哈希表看測試了這一點。

(我剛纔的評論,但我沒有足夠的經驗來做到這一點尚未;)

+0

很不幸,我們有一些用戶的登錄是一個整數。也許我可以用某種方式加上前綴。我會檢查。 – MiniQuark 2009-03-03 04:45:49