2011-12-15 83 views
0

我工作的一個簡單的Rails項目,我想知道是否可以給我找對象有兩個不同的參數,如有兩個參數

def show 
@user = User.find_by_name(params[:name]) 
or 
@user = User.find_by_id(params[:id]) 
end 

在這種情況下,我想找到對象能夠通過他們的id或他們的名字找到用戶,以便當我輸入像localhost:3000/users/mike這樣的網址時,我需要用戶showpage時我輸入 localhost:3000/users/4我給同一個用戶顯示頁面。請在軌道中如何做到這一點。

回答

2

我可能會在您的用戶模型中定義一個特殊的查找方法,可能是這個樣子:

class User < ActiveRecord::Base 

    def self.find_by_id_or_name(arg) 
    # Checks to see if the supplied argument is numerical i.e. an id, not name 
    if arg.match(/^[0-9]+$/) 
     # send argument to default find method that looks up by id 
     User.find(arg) 
    else 
     # send argument to find_by_name! to look up record by name instead. 
     # The added ! makes sure that if no record is found, an RecordNotFound error is raised 
     User.find_by_name!(arg) 
    end 
    end 
end 

然後,你可以在你的控制器使用方法是這樣的:

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

編輯:

此外,爲了防止故障,您應該確保用戶名不能僅包含數字,以便它不使用find當它真的被賦予一個用戶名時,通過id參數。但是這可以通過驗證來處理。

+3

`User.find_by_id(blah)|| User.find_by_name(blah)`對你來說不夠好? :) – 2011-12-15 01:39:24