2017-06-23 92 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