名称错误:未初始化常量ApplicationRecord。

3

我遇到了上述错误,但我相信我正在使用Rails 5:

turlingdrome$ rails -v
/Users/brianp/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-5.2.3/lib/rails/app_loader.rb:53: warning: Insecure world writable dir /Users/brianp/work in PATH, mode 040777
Rails 5.2.0

turlingdrome$ rake db:migrate
rake aborted!
NameError: uninitialized constant ApplicationRecord
/Users/brianp/work/online-reporting/app/models/client.rb:1:in `<top (required)>'
/Users/brianp/work/online-reporting/config/routes.rb:7:in `block in <top (required)>'
/Users/brianp/work/online-reporting/config/routes.rb:1:in `<top (required)>'
/Users/brianp/work/online-reporting/config/environment.rb:5:in `<top (required)>'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)

我认为--trace不是很有用...但如果需要,可以将其附加上...


看起来你在使用 Rails 5.2。它没有获取到模块 ApplicationRecord,这让我认为你需要运行 bundle install 命令。 - ekr990011
2个回答

4
你有两个选择,你可以改变 app/models/client.rb 类的声明为:
class Client < ActiveRecord::Base

或者你也可以创建一个app/models/application_record.rb文件,文件内容如下:

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

1
我从MongoDB转换到ActiveRecord后忘了这一点。谢谢! - Kyle Carlson

4

在 5 版之前,Rails 生成的模型都继承自 ActiveRecord::Base

# rails g model foo.
class Foo < ActiveRecord::Base

end

Rails 5 引入了 ApplicationRecord,它是模型中的对应项,类似于 ApplicationController。因此,在 Rails 5 上生成以下内容:
# rails g model foo.
class Foo < ApplicationRecord

end

当你运行rails new命令时,ApplicationRecord类本身就会被生成。

然而它本身并没有什么神奇的地方 - 它只是一个超类,在约定中根深蒂固。

# app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

如果你遇到 NameError: uninitialized constant ApplicationRecord 错误,可能是因为你在升级Rails5时未创建或者不小心删除了它。解决方法很简单,只需要重新创建该文件即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接