2013-04-22 70 views
0

我被這個問題困住了。我在我的Sinatra應用程序中有以下DataMapper模型;NoMethodError - 未定義方法'id'爲零:在Heroku上部署Sinatra應用時的NilClass

class Word 
    include DataMapper::Resource 
    property :id, Serial, :key => true 
    property :word, String 
end 

以下是我的代碼的另一個片段;

get '/kamus/:alph' do 
    @alph = %w{A B C D E F G H I J K L M N O P Q R S T U V W X Y Z} 

    firstword = Word.first(:word.like=>"#{params[:alph]}%") 
    lower = firstword.id 
    lastword = Word.last(:word.like=>"#{params[:alph]}%") 
    upper = lastword.id 
    @words = Word.all(:id=>(lower..(lower+(upper-lower)%1000))) 
    erb :kamus 
end 

我遇到的問題是;在當地的開發環境中,一切正常。但是當我在Sinatra上部署時,我得到了臭名昭着的「內部服務器錯誤」。在我的命令行中輸入;

heroku logs 

我發現問題與id屬性有關,如下所示;我知道我正在使用不同的數據庫(在開發; SQLite3和生產; PostgreSQL中)。我對Heroku爲什麼不能識別變量首字和尾字作爲Word類型感到困惑。我很確定這個問題與此有關,因爲當我使用從我的SQL表中手動讀取的整數替換變量lower和upper時,該應用程序工作正常。有人可以幫我嗎?

+0

首先,數據庫中的單詞是否存在於heroku中?其次,你是在做一個不區分大小寫的LIKE查詢或區分大小寫的查詢嗎?後者可能什麼都不會返回。第三,即使沒有任何記錄,你的應用程序也不應該崩潰。它應該只是返回一個空的集合到視圖,以便它可以說「找不到記錄」 – 2013-04-22 14:05:41

+0

感謝您的回答。對你的問題; yesku數據庫中存在單詞heroku。我認爲你的第二個迴應可能是我的問題的線索,因爲我甚至沒有想到查詢是區分大小寫的或不區分大小寫的。我認爲如果沒有找到記錄,首先就不會有類Word中的方法被訪問。我馬上檢查一下。 – amirothman 2013-04-22 21:57:37

+0

你是對的!顯然,對SQLite的數據映射器查詢不區分大小寫,並且對Postgres IS的數據映射器查詢也是如此。非常感謝你! – amirothman 2013-04-22 22:14:39

回答

1

首先,數據庫中的單詞是否存在於heroku?

其次,你在做一個不區分大小寫的LIKE查詢或區分大小寫的查詢嗎?後者可能什麼都不會返回。

第三,即使沒有任何記錄,您的應用程序也不應該崩潰。它應該只是返回一個空的集合到視圖,以便它可以說「找不到記錄」。

+1

我感覺到了一種新的情緒。我感到骯髒與感激。 :d – amirothman 2013-04-23 04:16:31

相關問題