【问题标题】:Active Record - User.new throws no error if invalid data typeActive Record - 如果数据类型无效,User.new 不会引发错误
【发布时间】:2023-03-16 04:33:01
【问题描述】:

假设我在 Rails 中有一个用户模型,其中包含一个名为 birth_date 的日期字段和一个名为 some_number 的整数字段。我的问题是,如果我这样做User.new(birth_date: "foo", some_number: "bar"),我不会得到任何错误。事实上我会得到#<User id: nil, birth_date: nil, some_number: 0, created_at: nil, updated_at: nil>

我想有一个错误告诉我该字段无效,以便可以警告客户。但由于我不一定需要birth_date,所以我不能使用存在 true 的birth_date 验证。所以用户最终被保存到数据库中,其出生日期等于 nil 并且没有错误。

这里的目标是,如果在参数中发送了birth_date,那么我们要么将birth_date 等于nil 保存到数据库中,但得到一条错误消息,或者我们根本不保存到数据库中。如果没有在参数中发送birth_date,我们不会抛出错误。

我想到了一种解决方法,即查看参数中存在的字段,查看确实记录到数据库中的内容并比较两者。但我认为可能存在更好的方法。

为了测试,这里有一些代码:

  • 用户模型

    类用户<:base>

    结束

  • 用户迁移

类 CreateUsers

  def change
    create_table :users do |t|
      t.date :birth_date
      t.integer :some_number

      t.timestamps null: false
    end
  end
end
  • 用户控制器

    类用户控制器

非常感谢您的帮助!

【问题讨论】:

  • has_key 方法是否不适合您的需求?然后您可以通过if params.has_key(:birth_date) then 进行检查

标签: ruby-on-rails validation rails-activerecord


【解决方案1】:

您可能希望创建一个自定义验证(请参阅here),将所需消息添加到用户实例上的错误数组中。指南穿过突出的部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    相关资源
    最近更新 更多