如何使用 Rails 创建数据库记录? - ActiveRecord::UnknownAttributeError

How to create a database record with rails? - ActiveRecord::UnknownAttributeError

我在数据库中创建新日志时遇到问题。我最近从 rails 的过时版本升级到最新版本,所以我不太确定发生了什么变化。我一直在通过升级修复很多错误,但我对这个感到难过。它抱怨工厂没有名称属性,但是当我打开我的架构时,它似乎就在那里,所以我不确定从这里去哪里。

查看

= form_tag factories_path, :multipart => true  do
    = label :factory, :name, 'Name'
    = text_field :factory, :name
    %br
    = label :factory, :poolMin, "Pool Min"
    = text_field :factory, :poolMin
    %br
    = label :factory, :poolMax, "Pool Max"
    = text_field :factory, :poolMax
    %br
    = submit_tag 'Create Factories'

控制器

def create
  @factory = Factory.new(user_params)
  @factory.save
  redirect_to factories_path
end
def user_params
  params.require(:factory).permit(:name, :poolMin, :poolMax)
end

Schema.rb

create_table "factories", :force => true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "name"
    t.integer  "poolMin"
    t.integer  "poolMax"
end

错误:

工厂的未知属性 'name'。 提取的源代码(大约第 10 行):

def create
  @factory = Factory.new(user_params)
  @factory.save
  redirect_to factories_path
end

要求

参数:

{"utf8"=>"✓", "authenticity_token"=>"7MXAkLikF6Mm+rXd3YrI8W25i9/Q85Peqv2AWeDRKl3+aZZtWtgiKuh0SSghhMoTHvGYn    pnfldduKqd08SkAdw==",
 "factory"=>{"name"=>"f",
 "poolMin"=>"33",
 "poolMax"=>"44"},
 "commit"=>"Create Factories"}

ActiveRecord::UnknownAttributeError 清楚地表明您的数据库中没有映射列(name 在您的情况下)。

但是您的 Schema.rb 表明您 name 列存在于您 factories table 中。因此,请在控制台上尝试 运行 rails db 并交叉检查 factories table.

中的列

我们不能完全说出确切的问题,但我可以告诉你我将采取的调试过程。

1) 打开 Rails 控制台并确保您可以 Factory.new(name: "blah", poolMin: 0, poolMax: 10)。您可能正在处理比您想象的更底层的问题。该问题可能与 user_params(应该是 factory_params,顺便说一句)或您的控制器无关。

2) 排除这种可能性后,尝试每个属性,一次一个,看看是否只有其中一个属性出现错误。如果你只用 :name 发出请求,你还会得到未知属性错误吗?如果你单独尝试 :poolmin,(对于样式 "The Rails Way" 应该是 pool_min)它有效吗?等等。到那时,您可以知道它是哪个,并深入研究您的数据库,看看是否有小的拼写错误或其他不易察觉的错误。

4) 使用 Gem Better 错误,您可以在控制器中调用 "fail",然后进入 Better Errors 控制台和 运行 命令,就像您在命令行中一样控制器中的确切时刻。尝试一下,看看它是否有效。

5) 尝试重写代码,看看重写时是否 运行 出现完全相同的错误。

6) 出于可能的绝望,如果以上所有方法都不起作用,您可以尝试使用 Active Record 的其他方法在数据库中创建记录。 Factory.create(name: "blah", poolMin: 0, poolMax: 10),这将创建模型并将其保存在一个命令中。如果你用一声巨响! (即 Factory.create!(...))它会给你一个正确的错误信息。你可以使用 save! 等等。无论如何,你不应该走到这一步!

希望对您有所帮助!