Problem with Creation form (Simpleform) PG::NotNullViolation: ERROR: null value in column with Rails

Problem with Creation form (Simpleform) PG::NotNullViolation: ERROR: null value in column with Rails

你好,当我尝试创建属于用户和 Nounou 的 "Enfant" 时,我的应用程序 Rails 出现问题,但我的问题是当我创建 "enfant"我是一个有 ID 的用户,但是我还没有选择一个 nounou,所以我还没有 nounou_id 这是我的不同代码(我尝试输入 optional: true 但它不起作用: 模型和架构

class Enfant < ApplicationRecord
  belongs_to :user
  belongs_to :nounou, optional: true
end


class Nounou < ApplicationRecord
  has_many :enfants
end


class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :enfants
end


  create_table "enfants", force: :cascade do |t|
    t.string "last_name"
    t.string "first_name"
    t.bigint "nounou_id", null: false
    t.bigint "user_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["nounou_id"], name: "index_enfants_on_nounou_id"
    t.index ["user_id"], name: "index_enfants_on_user_id"
  end

  create_table "nounous", force: :cascade do |t|
    t.string "name"
    t.integer "price"
    t.string "localisation"
    t.integer "evaluation"
    t.integer "places"
    t.string "first_name"
    t.string "last_name"
    t.string "photo"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.string "username"
    t.string "photo"
    t.string "first_name"
    t.string "last_name"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

end


null: false 选项有两个问题:

  • 不认为 belongs_to 关联是可选的。
  • 如果数据库中已有记录,运行迁移将产生异常,因为没有默认值(在 PostgreSQL 中,PG::NotNullViolation: ERROR: column "user_id" contains null values)。

Here's the reference.

解法:

  • 您的表单可能将 nounou_id 作为 nil 或其他方式发送。您需要通过检查您的 params 达到您的 create 方法来验证这一点。

  • 您已将 nounou_id 设为仅在模型中可选,但您需要 运行 迁移以使其在 db 中也是可选的,它清楚地表明它不能为假(null: false)。 您可以从 .

  • 获得有关该迁移的帮助
  • 你应该在rails中修改你的enfant_params方法:

def enfant_params
  params.require(:enfant).permit(:last_name, :first_name, :user_id, :nounou_id)
end

我相信这会解决您的问题,但如果您仍然需要帮助,请使用表单代码、create 操作和 enfant_params 更新您的问题并更新 schema

祝你好运。

非常感谢它在我的迁移文件中:t.bigint "nounou_id" t.bigint "user_id", null: false
我为 nounou_id 删除了 null:false 并且它有效 ;)

我 运行 在尝试将 user_id 列添加到猫 table 时遇到了类似的问题。它一直返回相同的 NotNullViolation 错误。这对我有用,可以清除错误,以便我能够在添加到 table 的列上保留“null: false”约束。我很可能 运行 陷入错误,因为已经有没有用户的猫。 运行 下面的命令,它也应该为您修复错误。我从另一个 question.

那里学到了这个技巧
rails db:drop
rails db:create
rails db:migrate --trace