使用两个参数查找对象

时间:2011-12-15 01:23:23

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我正在开发一个简单的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它也带我到同一个用户显示页面。如果有可能在轨道上,请怎么做。

1 个答案:

答案 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名称。但这可以通过验证来处理。