首页 > 解决方案 > Rails 5 尝试将空字符串保存为 nil

问题描述

我正在将我的 Rails 应用程序从版本 4.1.16 升级到 5.2.3

我有一列没有空约束,默认值为 0

架构.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" = $1, "updated_at" = $2 WHERE "table_name"."id" = $3  ["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 中运行良好。

我该如何解决这个问题?我在我的应用程序的大多数地方都遇到了这个问题。谢谢。

标签: ruby-on-railsruby-on-rails-5.2

解决方案


一种解决方案是使用before_save

# model.rb
before_save do
  self.wait_time_minutes ||= 0
end

如果您不熟悉在||=尚未设置变量的情况下实例化变量的常见 Ruby 技巧。


推荐阅读