我被这个问题困住了。我在我的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时,该应用程序工作正常。有人可以帮我吗?
首先,数据库中的单词是否存在于heroku中?其次,你是在做一个不区分大小写的LIKE查询或区分大小写的查询吗?后者可能什么都不会返回。第三,即使没有任何记录,你的应用程序也不应该崩溃。它应该只是返回一个空的集合到视图,以便它可以说“找不到记录” – 2013-04-22 14:05:41
感谢您的回答。对你的问题; yesku数据库中存在单词heroku。我认为你的第二个回应可能是我的问题的线索,因为我甚至没有想到查询是区分大小写的或不区分大小写的。我认为如果没有找到记录,首先就不会有类Word中的方法被访问。我马上检查一下。 – amirothman 2013-04-22 21:57:37
你是对的!显然,对SQLite的数据映射器查询不区分大小写,并且对Postgres IS的数据映射器查询也是如此。非常感谢你! – amirothman 2013-04-22 22:14:39