Rails 5 尝试将空字符串保存为 nil
Rails 5 tries to save the empty string as nil
我正在将我的 Rails 应用程序从版本 4.1.16 升级到 5.2.3
我有一个非空约束和默认值为 0 的列
schema.rb:
t.integer wait_time_minutes default: 0, null: false
相关表格包含以下内容:
= f.select :wait_time_minutes, [15, 30, 45, 60, 90, 120], { include_blank: true }, class: 'form-control'
在未选择任何值的情况下提交此表单时,将在参数中提交以下内容:
"wait_time_minutes"=>""
它尝试用 nil 更新列:
UPDATE "table_name" SET "wait_time_minutes" = , "updated_at" = WHERE "table_name"."id" = ["wait_time_minutes", nil], ["updated_at", "2019-06-23 05:32:28.368640"], ["id", 1445]]
由于该列没有空约束,因此引发以下异常:
PG::NotNullViolation - ERROR: null value in column "wait_time_minutes" violates not-null constraint
但这不是以前的工作方式。它在 Rails 4.1.16.
中运行良好
我该如何解决这个问题?我在我的应用程序的大部分地方确实有这个问题。谢谢。
一种解决方案是使用 before_save
# model.rb
before_save do
self.wait_time_minutes ||= 0
end
如果您不熟悉 ||=
,Ruby 实例化一个尚未设置的变量是很常见的技巧。
我正在将我的 Rails 应用程序从版本 4.1.16 升级到 5.2.3
我有一个非空约束和默认值为 0 的列
schema.rb:
t.integer wait_time_minutes default: 0, null: false
相关表格包含以下内容:
= f.select :wait_time_minutes, [15, 30, 45, 60, 90, 120], { include_blank: true }, class: 'form-control'
在未选择任何值的情况下提交此表单时,将在参数中提交以下内容:
"wait_time_minutes"=>""
它尝试用 nil 更新列:
UPDATE "table_name" SET "wait_time_minutes" = , "updated_at" = WHERE "table_name"."id" = ["wait_time_minutes", nil], ["updated_at", "2019-06-23 05:32:28.368640"], ["id", 1445]]
由于该列没有空约束,因此引发以下异常:
PG::NotNullViolation - ERROR: null value in column "wait_time_minutes" violates not-null constraint
但这不是以前的工作方式。它在 Rails 4.1.16.
中运行良好我该如何解决这个问题?我在我的应用程序的大部分地方确实有这个问题。谢谢。
一种解决方案是使用 before_save
# model.rb
before_save do
self.wait_time_minutes ||= 0
end
如果您不熟悉 ||=
,Ruby 实例化一个尚未设置的变量是很常见的技巧。