2

在 O'Reilly 书籍的帮助下,我正在使用 Sinatra 和 DataMapper 构建一个 url 缩短服务的克隆。当我通过提交用于缩短的 url 对其进行测试时,出现此错误

NoMethodError - undefined method `visits' for nil:NilClass:

对于第 31 行。似乎 Link 类没有访问属性,但是,正如您从下面的类定义中看到的那样,这种关系是我应该能够调用的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
4

3 回答 3

1

创建新访问的更好方法:

link.visits.new(:ip => get_remote_ip(env))
link.save

或者:

Visit.create(:ip => get_remote_ip(env), :visit => visit)
于 2012-09-05T17:49:26.907 回答
1

我相信这是您的问题所在:

link = Link.first(:identifier => params[:short_url])

我打赌linknil

当您收到类似的错误时

NoMethodError - undefined method `visits' for nil:NilClass:

这是说您试图调用visits对象上的方法nil。您期望visitsLink对象上调用该方法。

如果要查找记录(如果存在)或创建新记录,请尝试以下操作:

Link.first_or_create(:identifier => params[:short_url])
于 2012-09-05T02:40:15.260 回答
0

问题不在于 Link 没有访问属性。问题是你的线路

Link.first(:identifier => params[:short_url])

返回零。

所以它没有找到任何与您的搜索匹配的记录。

为了证明这一点,尝试做

link = Link.get(1)

你应该找到一个结果。

于 2012-09-05T02:43:52.883 回答