检查 Sinatra/DataMapper 中是否存在记录

Checking if a record exists in Sinatra/DataMapper

我目前使用用户的序列号生成用户的个人资料页面,如下所示:

get '/users/:id' do
  @user = User.get(params[:id])
end

这很好用,直到输入了数据库中不存在的数字。

我知道如果找不到记录我可以将 User.get 更改为 User.get! 到 return 一个 ObjectNotFoundError 错误,但我不确定我如何使用它来帮助我。

以前用RoR的时候.exists?

有什么建议吗?

提前致谢!

编辑:我将不回答这个问题,因为我实际上还没有找到我在标题中提出的问题的解决方案;但是,我确实设法通过检查输入的 :id 是否高于数据库中存在的用户数量来解决我自己的问题,如下所示:

if params[:id].to_i > User.count
  "This user does not exist."
else
  @users_id = User.get(params[:id])
  erb(:'users/id')
end

您已经有了正确的代码:

@user = User.get(params[:id])

如果不存在具有给定 ID 的用户,则 #get 将 return 为零。然后你可以做一个条件:

@user = User.get params[:id]
if @user
  # user exists
else
  # no user exists
end

这是 Ruby 中非常常见的模式,它利用了除 falsenil 之外的任何其他内容的 "truthiness"。也就是说,您可以说 if 0if [],条件将评估为真

您可以重新创建一个 .exists? 方法:

class User
  def self.exists?(id_or_conditions)
    if id_or_conditions.is_a? Integer
      !! User.get id_or_conditions
    else
      !! User.first id_or_conditions
    end
  end
end

#get 类似于 rails 中的 #find,只是如果找不到记录它不会引发错误。 #first类似于rails中的#find_by