Datamapper 不保存 ID,LocalJumpError - 没有给出块
Datamapper not saving ID, LocalJumpError - no block given
我最近重构了我的 DataMapper 代码,慢慢地推出它,并让它在一个数据库上运行,但现在我在将它推出到我的费用数据库时遇到了问题。在任何地方都找不到答案,我已经尝试了很多摆弄。
我有一个表单(使用 Sinatra)接受多个输入,前缀为 "expense_",它应该获取该数据,将其发送到数据库,并将收据图像上传到 S3。但是如果我打开 DataMapper 错误报告,我会得到一个 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")
数据映射器class:
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 方法之前。这修复了它,现在可以使用了!
我最近重构了我的 DataMapper 代码,慢慢地推出它,并让它在一个数据库上运行,但现在我在将它推出到我的费用数据库时遇到了问题。在任何地方都找不到答案,我已经尝试了很多摆弄。
我有一个表单(使用 Sinatra)接受多个输入,前缀为 "expense_",它应该获取该数据,将其发送到数据库,并将收据图像上传到 S3。但是如果我打开 DataMapper 错误报告,我会得到一个 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")
数据映射器class:
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 方法之前。这修复了它,现在可以使用了!