2015-09-05 35 views
0

我想只允許一個人看到頁面,如果他們的名字在數據庫中。我想最好的方法是循環遍歷所有條目並檢查它是否匹配,如果它確實顯示並停止循環。我一直得到一個空白頁面,有任何幫助?我怎樣才能得到這個ruby代碼與續集在sinatra工作?

get '/' do 
    user = "john" 
    num = DB[:users].all 

    for person in num do 
    if person[:name].to_s == user then 
     File.read('index.html') 
     break 
    else 
     "you're not authorized" 
    end 
    end 

end 

如果我刪除說,如果語句中打破了線,我得到這個錯誤:

NoMethodError at/
    undefined method `bytesize' for #<Hash:0x007fcf60970a68> 
    file: utils.rb location: bytesize line: 369 
+0

你忘了發佈你收到的錯誤。 –

+0

我得到的是一個空白頁,我在嘗試其他類似的事情時得到了錯誤,但是對於這個具體情況,我的頁面是空白的,我無法弄清楚爲什麼,如果我拿出'break'我得到錯誤在它下面 –

回答

1

的問題是,一個for循環計算到nil(除非你break和供應一個值爲break),所以你的塊返回nil,所以沒有什麼可渲染的。

但真正的問題是for在這裏是錯誤的解決方案。你要做的是檢查數組DB[:users].all是否包含一個散列,其中的:name成員等於user。您可以使用循環,但除了慣用的Ruby代碼中罕見的forEnumerable#each是首選)之外,它使代碼的意圖更難理解。相反,你可以使用Enumerable#find(Array類包括可枚舉模塊中的方法),像這樣:

get '/' do 
    username = "john" 
    users = DB[:users].all 

    matching_user = users.find do |user| 
    user[:name] == user 
    end 

    if matching_user 
    return File.read('index.html') 
    end 

    "you're not authorized" 
end 

...但因爲你實際上並不關心匹配的用戶,你只關心是否匹配用戶存在 - 它會更清楚使用Enumerable#any?,剛剛返回truefalse

get '/' do 
    username = "john" 
    users = DB[:users].all 

    if users.any? {|user| user[:name] == user } 
    return File.read('index.html') 
    end 

    "you're not authorized" 
end 

編輯:作爲@ user846250指出,這將是最好讓數據B ase做檢查是否存在任何匹配用戶的工作。事情是這樣的:

get '/' do 
    username = "john" 

    if DB[:users].where(:name => username).empty? 
    return "you're not authorized" 
    end 

    File.read('index.html') 
end 

這是可取的,因爲不是從數據庫到紅寶石(這正是DB[:users].all會做)加載所有的記錄 - 當你實際上並沒有任何人關心數據--Sequel只會詢問數據庫是否有匹配記錄,然後返回truefalse

+0

哇謝謝,我不知道在紅寶石中是罕見的,我只是從基本的python過來。 –

+1

因爲你使用'Sequel',你實際上可以使用更像SQL的查詢,如'!DB [:users] .where(:name => username).empty?',如果用戶存在,否則爲'false'。 –

+0

好的,@ user846250。我已經編輯了我的答案,以包含這些信息。 –

相關問題