2013-04-22 66 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

相关问题