【问题标题】:Can't seem to save object into database似乎无法将对象保存到数据库中
【发布时间】:2020-12-28 04:21:18
【问题描述】:

这是我的 ActiveRecord:

class CreateTasks < ActiveRecord::Migration[6.1]
  def change
    create_table :tasks do |t|
      t.string :title
      t.text :body
      t.datetime :due
      t.integer :priority
      t.text :tag

      t.timestamps
    end
  end
end

我试图在rails console 中创建一个对象并保存它,但它一直返回 false

irb(main):008:0> t =Task.new(title:"First task", body:"body of first task", due:"2020-12-29", priority:2, tag:"tag of first task")
=> #<Task id: nil, title: "First task", body: "body of first task", tag: "tag of first task", due: nil, priority: 2, created_at: nil, updated_at: nil>
irb(main):018:0> t.save
=> false

我检查了多个站点以确保我的语法正确,但我仍然无法保存此对象

我的任务模型

class Task < ApplicationRecord
  belongs_to :container

  validates :title, presence: true
  validates :body, presence: true, length: { minimum: 10 }
  validates :priority, presence: true
  validates :due, presence: true
  validates :tag, presence: true

end

【问题讨论】:

    标签: sql ruby-on-rails database


    【解决方案1】:

    当您遇到此类问题时,通过在该实例上输出错误很容易进行调试。因此,当您在调用save 时返回false 时,只需调用t.errors.full_messages 或调用f.valid?,然后再调用t.errors.full_messages

    在您的new 参数列表中,您缺少container_id。从文档中看并不明显,但在内部添加 belongs_to :container 会添加对该关联存在的验证(除非您传递选项:optional: true)。

    此外,正如其他人已经指出的那样,您的数据库缺少一个用于存储 container_id 的列,该列用于存储由 belongs_to :container 创建的关联。

    所以要解决你的问题,你必须做两件事:

    1. 定义Container 模型及其数据库表,并正确设置belongs_to 关联。
    2. 将现有的container_id 传递给Task.new

    【讨论】:

    • 我从模型中删除了 Container 字段,我忘了删除关联
    • 所以问题是因为我没有删除旧的关联
    【解决方案2】:

    这里是提示

    在保存对象之前(在您的示例中为 t.save),运行验证并检查错误(t.valid? 然后 t.errors),这样您就会看到所有错误。有时在控制台中使用它很有用,但当您想在控制器(或任何地方)呈现错误时也很有用

    至于可能的答案

    请检查“belong_to :container”。当您使用belong_to 创建对象时,您必须传递参数(在您的情况下,它可能是“容器”作为ActiveRecord 对象,或者只是带有容器对象ID 的“容器ID”)。 看来,您没有将“belong_to”添加到迁移中(它通过“add_reference”添加),这就是您在请求中没有它的原因。这就是您无法创建新对象的可能原因。

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 2016-12-10
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多