2

O'Reillyの本の助けを借りて、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
4

3 に答える 3

1

私はこれがあなたの問題があるところだと信じています:

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

私は賭けlinkますnil

次のようなエラーが発生した場合

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

visitsオブジェクトのメソッドを呼び出そうとしたということですnil。オブジェクトのメソッドvisitsを呼び出すことを期待していました。Link

レコードが存在する場合はそれを検索するか、新しいレコードを作成する場合は、次のことを試してください。

Link.first_or_create(:identifier => params[:short_url])
于 2012-09-05T02:40:15.260 に答える
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 に答える
0

問題は、Linkにvisitsプロパティがないことではありません。問題はあなたのラインが

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

nilを返しています。

したがって、検索に一致するレコードは見つかりません。

これを証明するには、

link = Link.get(1)

結果が見つかるはずです。

于 2012-09-05T02:43:52.883 に答える