具有n,属于Sinatra中的DataMapper



在奥的一本书的帮助下,我正在使用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)

你应该找到一个结果。

最新更新