我正在开发一个简单的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它也带我到同一个用户显示页面。如果有可能在轨道上,请怎么做。
答案 0 :(得分:2)
我可能会在您的User模型中定义一个特殊的find方法,它看起来像这样:
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
编辑:
此外,为了确保故障安全,您应该确保用户名不能只包含数字,以便在确实为用户提供时,id参数不会使用find
名称。但这可以通过验证来处理。