2017-06-23 86 views
2

我目前使用的序列号,像这样产生用户的个人资料页:检查是否在西纳特拉存在记录/ DataMapper的

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 
+0

只是好奇,因为你可以抛出一个'ObjectNotFoundError'为什么不抓住它并重定向到404找不到页面? P.S从来没有尝试过sinatra,只是轨道 – Hatik

回答

2

您已经有了正确的代码:

@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 []和条件的值为true

您可以重新创建一个.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在轨类似于#find,但它并没有提高,如果一个错误记录未找到。 #first与rails中的#find_by类似。

+0

嘿最大。这很完美 - 谢谢!我非常感谢你的帮助。 – IainK