2 つの DataMapper モデルがあります。
class Address
include DataMapper::Resource
property :id, Serial
property :url, String, :required => true
has n, :logs
end
class Log
include DataMapper::Resource
property :id, Serial
property :useragent, String
belongs_to :address
end
Sinatra を使用して新しいアドレスを作成し、別の方法でこれらのアドレスに属するログを記録します。
# page after posting a form
post '/' do
@messages = []
if (params[:url] =~ URI::regexp).nil?
@messages.push('URL is not valid!')
else
address = Address.create(:url => params[:url])
base36 = address.id.to_s(36)
@messages.push(request.url + base36)
end
erb :index
end
# redirection from a short url
get '/:base36' do |base36|
# probably not necessary...
if base36 =~ /[[:alnum:]]+/
begin
id = base36.to_i(36)
address = Address.get(id)
log = Log.create(:useragent => request.user_agent)
address.logs << log
# log.save
address.save
# address.logs.save
address.logs.length.to_s
# redirect address.url
rescue
redirect '/'
end
else
redirect '/'
end
end
問題は、新しいログがデータベースに保存されていないことです。ページをリロードするたびに表示されます (インクリメントする必要があります) address.logs.length.to_s
。1
これを行うと(別の方法で):
logs = Address.get(id).logs
@views = logs.length
views
は常に0
。このコードの何が問題になっていますか?
わかりましたので、ユーザーエージェントが長すぎる文字列フィールドにプッシュしようとしました。文字列は 50 文字に制限されています。#datamapper irc チャンネルの人々が私を助けてくれました.save
。この場合、メソッドは false を返し、データは保存されません。