Ruby Datamapper未保存ID,LocalJumpError-未给出任何块

Ruby Datamapper未保存ID,LocalJumpError-未给出任何块,ruby,sinatra,datamapper,ruby-datamapper,Ruby,Sinatra,Datamapper,Ruby Datamapper,我最近重构了我的DataMapper代码,慢慢地将其推出,并使其在一个数据库上运行,但现在我在将其推出到我的费用数据库时遇到了问题。在任何地方都找不到答案,我也试了很多次 我有一个表单(使用Sinatra),它接受多个输入,并在前面加上“费用”,它应该获取数据,发送到数据库,然后将收据图像上传到S3。但是如果我打开DataMapper错误报告,我会得到一个nil id和一个LocalJumpError 这是我的密码: 数据库更新方法: def dm_update(method_list,mode

我最近重构了我的DataMapper代码,慢慢地将其推出,并使其在一个数据库上运行,但现在我在将其推出到我的费用数据库时遇到了问题。在任何地方都找不到答案,我也试了很多次

我有一个表单(使用Sinatra),它接受多个输入,并在前面加上“费用”,它应该获取数据,发送到数据库,然后将收据图像上传到S3。但是如果我打开DataMapper错误报告,我会得到一个nil id和一个LocalJumpError

这是我的密码:

数据库更新方法:

def dm_update(method_list,model,params,param_prefix,use_last_entry_if_param_empty=true)
    model_data = model.new
    method_list.each do |meth|
        # e.g. param is :expense_date, db column is :date
        param_name = (param_prefix + meth.to_s).to_sym
        param = params[param_name]
        if use_last_entry_if_param_empty
            # If true, use most recent entry from db - for use in settings changing
            data = param.empty? ? model.last[meth] : param
        else
            data = param
        end
        model_data.send("#{meth}=", data)
    end
    model_data.save
end
获取参数并发送到方法:

file_name = ("#{params[:expense_date]}_#{params[:expense_time].gsub(/:/, '')}_#{params[:expense_receipt_file][:filename]}")
temp_file = params[:expense_receipt_file][:tempfile]
expense_column_list = [:date,:time,:price,:currency,:description,:source,:receipt_filename]
params[:expense_receipt_filename] = file_name
dm_update(expense_column_list,Expense,params,"expense_",false)
upload(file_name, temp_file, "foo_bucket")
Datamapper类:

class Expense
include DataMapper::Resource
property :id, Serial, :required => true, :key => true
property :date, Date, :required => true
property :time, Time, :required => true, :default => Time.now
property :price, Float, :required => true
property :currency, String, :required => true, :default => "GBP"
property :description, String, :required => true
property :source, String, :required => true
property :receipt_filename, String
end

好的,问题的答案很简单

我破坏了代码,并逐行检查

日期参数以yyyy mm dd格式存储,时间参数以hh:mm格式存储。Datamapper不喜欢那段时间,我在原始版本中修复了这段时间,但在重构版本中未能修复

解决方案是添加以下行:

temptime = Time.parse(params[:date] + " " + params[:time])
params[:time] = temptime
在调用dm_update方法之前。这解决了它,现在它工作了