为什么续集不写入我的数据库表?

  • 本文关键字:数据库 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:有争议。问题可能不是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文档中的规则。

最新更新