2011-12-15 56 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