Sequel为什么不写我的数据库表?

时间:2012-09-11 09:33:30

标签: ruby sequel ramaze

控制器/ 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,但它不是空的。

发生了什么事?

2 个答案:

答案 0 :(得分:1)

您确定您的模型接受主键的质量分配吗?

尝试拨打Debate.unrestrict_primary_key

您可以查看Sequel documentation中的规则。

答案 1 :(得分:1)

您需要将“数据”传递给#update。因此:

debate.save(data)

错了,你必须这样做:

debate.update(data)
debate.save

如果您不这样做,您的辩论对象没有分配成员,因此其提问成员为零,违反了您的数据库约束。

在此处查看#save和#update之间的区别:

简而言之:#save会将当前模型实例保存到数据库中,而#update将在一次操作中更改一堆实例属性。

但您必须记住,更改模型实例的属性不会将它们写入数据库。您必须明确地致电#save