【问题标题】:Checking if a record exists in Sinatra/DataMapper检查 Sinatra/DataMapper 中是否存在记录
【发布时间】:2017-11-26 12:02:40
【问题描述】:

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

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

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

我知道如果找不到记录,我可以将 User.get 更改为 User.get! 以返回 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

【问题讨论】:

  • 只是好奇,既然你可以抛出ObjectNotFoundError ,为什么不抓住它并重定向到404 not found页面呢? PS从未尝试过sinatra,只是rails

标签: ruby sinatra datamapper


【解决方案1】:

您已经有了正确的代码:

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

如果不存在具有给定 id 的用户,则 #get 将返回 nil。然后你可以做一个条件:

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

这是 Ruby 中非常常见的模式,它利用了除 falsenil 之外的任何东西的“真实性”。即你可以说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

【讨论】:

  • 嘿,麦克斯。这是完美的 - 谢谢!非常感谢您的帮助。
猜你喜欢
  • 2010-12-17
  • 1970-01-01
  • 2011-02-20
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
相关资源
最近更新 更多