控制器/ 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:debates.question可能不是NULL
我检查了data.question
的postdata,但它不是空的。
发生了什么事?
答案 0 :(得分:1)
答案 1 :(得分:1)
您需要将“数据”传递给#update
。因此:
debate.save(data)
错了,你必须这样做:
debate.update(data)
debate.save
如果您不这样做,您的辩论对象没有分配成员,因此其提问成员为零,违反了您的数据库约束。
在此处查看#save和#update之间的区别:
简而言之:#save
会将当前模型实例保存到数据库中,而#update
将在一次操作中更改一堆实例属性。
但您必须记住,更改模型实例的属性不会将它们写入数据库。您必须明确地致电#save
。