为具有现有模型的表生成新的脚手架后,我遇到了错误: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
我做错了什么?
答案 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