在奥的一本书的帮助下,我正在使用Sinatra和DataMapper构建一个url缩短服务的克隆。当我通过提交一个缩短url来测试它时,我得到了这个错误
NoMethodError - undefined method `visits' for nil:NilClass:
对于第31行。Link类似乎没有visits属性,但是,正如您从下面的类定义中看到的,这种关系应该能够调用link.visits
我使用的是最新版本的DataMapper。有人能建议解决这个问题吗?
get '/:short_url' do
link = Link.first(:identifier => params[:short_url])
link.visits << Visit.create(:ip => get_remote_ip(env)) #this is line 32
link.save
redirect link.url.original, 301
end
类别
Class Url
include DataMapper::Resource
property :id, Serial
property :original, String, :length => 255
belongs_to :link
end
class Link
include DataMapper::Resource
property :identifier, String, :key => true
property :created_at, DateTime
has 1, :url
has n, :visits
class Visit
include DataMapper::Resource
property :id, Serial
property :created_at, DateTime
property :ip, IPAddress
property :country, String
belongs_to :link
after :create, :set_country
我相信这就是你的问题所在:
link = Link.first(:identifier => params[:short_url])
我打赌link
就是nil
当你遇到类似的错误时
NoMethodError - undefined method `visits' for nil:NilClass:
据说您试图在对象nil
上调用方法visits
。您期望在Link
对象上调用方法visits
。
如果你想找到一个记录(如果存在)或创建一个新记录,请尝试以下操作:
Link.first_or_create(:identifier => params[:short_url])
创建新就诊的更好方法:
link.visits.new(:ip => get_remote_ip(env))
link.save
或者:
Visit.create(:ip => get_remote_ip(env), :visit => visit)
问题不在于Link没有visits属性。问题是你的线路
Link.first(:identifier => params[:short_url])
正在返回零。
因此,它找不到任何与您的搜索匹配的记录。
要证明这一点,请尝试进行
link = Link.get(1)
你应该找到一个结果。