2

controller / 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が、nullではありません。

何が起こっている?

4

2 に答える 2

1

モデルが主キーの一括割り当てを受け入れていることを確認しますか?

電話してみてくださいDebate.unrestrict_primary_key

続編のドキュメントでルールを確認できます。

于 2012-09-11T21:17:09.657 に答える
1

'data'をに渡す必要があります#update。したがって:

debate.save(data)

間違っている、あなたがしなければならない:

debate.update(data)
debate.save

これを行わないと、ディベートオブジェクトにメンバーが割り当てられていないため、質問メンバーはnilになり、DBの制約に違反します。

ここで#saveと#updateの違いを確認してください。

簡単に言う#saveと、現在のモデルインスタンスをデータベースに保存し#update、1回の操作で一連のインスタンス属性を変更します。

ただし、モデルインスタンスの属性を変更しても、それらはデータベースに書き込まれないことを覚えておく必要があります。#save常に明示的に呼び出す必要があります。

于 2012-09-13T05:26:20.960 に答える