生成Scaffold后'NOT NULL约束失败'

时间:2016-03-30 04:25:46

标签: ruby-on-rails ruby

为具有现有模型的表生成新的脚手架后,我遇到了错误:NOT NULL constraint failed: questions.question_text

这有been covered before,但我没有看到有设置空值的答案,正如我在下面所做的那样。

首先,我已经为这个名为Questions的表生成了一个模型/迁移,它看起来像:

..._ create_questions.rb

 class CreateQuestions < ActiveRecord::Migration
   def change
     create_table :questions do |t|
     t.belongs_to :category, index: true
     t.string :question_text, :null => false

     t.timestamps
     end
   end
 end

请注意,我在指定null => false。为了节省时间,我运行了一个Scaffold命令,允许我轻松地将数据输入Questions

 rails generate scaffold Questions --skip

重新启动服务器后,我遇到了上面的错误。由于我直接解决了null值,因此当我到达block in QuestionsController#create时(换句话说,当我尝试创建一个问题时),我不清楚它为什么会触发错误。

如果有帮助,这里也是我的 Question.rb 模型:

class Question < ActiveRecord::Base

   has_many :quiz_questions
   has_many :quizzes, through: :quiz_questions
   has_many :answers
   belongs_to :category
   accepts_nested_attributes_for :answers

  end

我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果您使用not-null作为验证形式,那么您也希望添加一个强制执行此规则的模型验证:

class Question < ActiveRecord::Base
  # ...
  validates_presence_of :question_text
end

这将阻止数据库驱动程序级异常并提供用户反馈。

由于您运行了没有任何属性的脚手架生成器,我猜测params白名单也可能是空的,这会导致上述验证失败,因为输入实际上从未传递给初始化器。

class QuestionsController < ApplicationController

  def create
    @question = Question.create(question_params)
    # ...
  end

  private 

    def question_params
      params.require(:question)
            .permit(
              :category_id, 
              :question_text
              answers_attributes: [:foo, :bar, :baz]
            )
    end
end