I have two DataMapper models:
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
I use Sinatra to create new addresses, and in another method logs which belongs to these addresses.
# 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
The problem is, that new logs aren't stored in a database. address.logs.length.to_s
Is 1
on every page reload (it should be incrementing). When I do this (in another method):
logs = Address.get(id).logs
@views = logs.length
views
are always 0
. What is wrong with this code?
OK, so I tried do push to the String field too long useragent. String is limited to 50 characters. People on #datamapper irc channel helped me, .save
method returns false in this case and data isn't stored.