ruby-on-rails - 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 中运行良好。
我该如何解决这个问题?我在我的应用程序的大多数地方都遇到了这个问题。谢谢。
解决方案
一种解决方案是使用before_save
# model.rb
before_save do
self.wait_time_minutes ||= 0
end
如果您不熟悉在||=
尚未设置变量的情况下实例化变量的常见 Ruby 技巧。
推荐阅读
- solr - solr 建议器没有结果
- palantir-foundry - 本体管理应用中“渲染提示”的范围和作用是什么?
- c# - 尝试使用 Microsoft.Graph 检索 AD 组的所有成员时出现授权错误
- python - 仅在找到第一个数字条目时返回 True,在所有其他情况下返回 False
- python - 将数据从自定义数据生成器传递到 model.fit()
- python - Django“manage.py startapp”功能通过一个视图
- microchip - MPLAB X IDE 在闪烁后显示消息“Hold in reset not implemented”
- amp-html - 如何将提交成功的 JSON 响应分配给 PHP 循环中的单击事件。放大器形式,放大器绑定
- apache-spark - Spark Confluent 模式注册表客户端 - 无法识别的字段“schemaType”
- websocket - 未连接到互联网时 ESP32 websocket 网络服务器的奇怪行为