控制器/makenew.rb
class MakeController < Controller
map '/makenew'
#require 'model/debate'
def debate
if request.post? #this line is potentially dangerous!
#---> 1/3 fetch postdata
data = request.subset(:question, :type, :category, :assertion)
data['user_id'] = user.id #id = request.params['id']
#---> 2/3 check permissions
if user.points < 40
flash[:error] = 'You don't have enough points to make a debate.'
redirect_referrer
else
debate = Debate.new
end
#---> 3/3 modify database
begin
debate.save(data)
flash[:success] = success
flash[:form_data] = debate
redirect 'debates'
rescue => e
Ramaze::Log.error(e)
#flash[:form_errors] = debate.errors
#flash[:error] = data
flash[:error] = e
#flash[:error] = 'Failure whilst saving. Contact technical support!'
redirect 'debates' #redirect_referrer
end
#|
end #closes posting conditional
end #closes makesave
end
我得到的错误是.
SQLite3::ConstraintException:有争议。问题可能不是NULL
我已经检查了data.question
的postdata,它不是null。
发生了什么事?
您需要将"data"传递给#update
。因此:
debate.save(data)
是错误的,你必须这样做:
debate.update(data)
debate.save
如果你不这样做,你的辩论对象没有分配成员,因此它的问题成员为零,这违反了你的DB约束。
点击此处查看#save和#update之间的区别:
- 更新:http://sequel.rubyforge.org/rdoc/classes/Sequel/Model/InstanceMethods.html#method-i-update
- 保存:http://sequel.rubyforge.org/rdoc/classes/Sequel/Model/InstanceMethods.html#method-i-save
简而言之:#save
将把当前模型实例保存到数据库中,而#update
将在一次操作中更改一堆实例属性。
但您必须记住,更改模型实例的属性不会将它们写入数据库。您总是必须显式调用#save
。
您确定您的模型接受主键的批量分配吗?
尝试调用Debate.unrestrict_primary_key
您可以查看Sequel文档中的规则。