如何使用 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! 等等。无论如何,你不应该走到这一步!
希望对您有所帮助!
我在数据库中创建新日志时遇到问题。我最近从 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! 等等。无论如何,你不应该走到这一步!
希望对您有所帮助!