[英]Rails: NameError: uninitialized constant
我有一個名為 PhoneNumber 的簡單 model:
class PhoneNumber < ActiveRecord::Base
validates :pnumber, presence: true, on: :create #=> { :message => " cannot be blank" }
validates :pnumber, numericality: true, on: :create
end
我 go 到應用程序的根文件夾(包含 app 子文件夾的文件夾)並啟動控制台:
rails console --sandbox
當我嘗試創建一個空的 PhoneNumber 時(我想收到一條錯誤消息,因為驗證將失敗)我收到以下錯誤消息:
2.0.0-p451 :001 > PhoneNumber.new
NameError: uninitialized constant PhoneNumber
from (irb):1
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/commands/console.rb:90:in `start'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/commands/console.rb:9:in `start'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/commands/commands_tasks.rb:69:in `console'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/commands.rb:17:in `<top (required)>'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:43:in `require'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:43:in `block in exec_app_rails'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:32:in `loop'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:32:in `exec_app_rails'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/cli.rb:5:in `<top (required)>'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/bin/rails:9:in `require'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/bin/rails:9:in `<top (required)>'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/bin/rails:23:in `load'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/bin/rails:23:in `<main>'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/bin/ruby_executable_hooks:15:in `eval'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/bin/2.2.2.02.02.02.0.2.2.02.222222.2.02.02.0.2.2.022222222222222
控制台似乎不知道 model。在普通的 ruby 中,您需要“要求”包含 class 的文件,但我認為 Rails 控制台應自動加載所有模型。 這里發生了什么?
一些嘗試:
重啟 rails 控制台; 如果您這樣做> reload!
,則模型的更改只會被已經打開的rails控制台接收> reload!
(雖然我發現這是不可預測的),或者通過重新啟動控制台。
您的模型文件是否名為“phone_number.rb”並且在“/app/models”中?
您應該仔細檢查 rails 控制台命令中的“--sandbox”選項。 AFAIK,這會阻止更改。 不用開關試試。
我收到錯誤:
NameError: uninitialized constant
然后我注意到我不小心創建了一個復數模型,所以我回去將模型文件重命名為單數,並將模型文件中的類名更改為單數並解決了它。
將 Rails 5.1 升級到 5.2 后,我開始遇到這個問題
我解決了:
spring stop
spring binstub --all
spring start
rails s
我也直接在models
目錄中使用一個文件遇到了這個問題,結果發現我沒有在啟動時正確加載代碼。 我能夠通過在我的 development.rb 文件中設置config.eager_load = true
來解決這個問題。 這使我可以在控制台中使用該類
與@Michael-Neal 類似。
我將控制器命名為單數。 應用程序/控制器/ product_controller.rb
當我將其重命名為復數時,錯誤解決了。 應用程序/控制器/ products_controller.rb
如果以上都不起作用,我也有不同的方法,因為它在真實場景中發生在我身上。
更具體地說,使用來自Thrift 的自動生成的 Ruby 文件。
在我的情況下,我有一個包含多個類的Module
,因此在這種情況下順序很重要:
Class A
Class B
在同一模塊中使用Class B
。 但是, Class B
是在Class A
Class B
之后聲明Class A
。
只需在Class A
向我解決問題之前聲明Class B
Class A
即可。
我遇到這個問題是因為我在模型中更改了類的名稱,並且它與文件的名稱不匹配。
"模型類名使用駝峰式命名。這些是單數,會自動映射到復數的數據庫表名。
模型文件位於 app/models/#{singular_model_name}.rb 中。”
https://gist.github.com/iangreenleaf/b206d09c587e8fc6399e#model
通過確保文件名與具有正確約定的類名相同,我的問題也得到了解決,例如class AdLikes
具有文件名ad_likes.rb
我有同樣的錯誤。 事實證明,在我草率的搭建過程中,我遺漏了 model.rb 文件。
我有一個類似的錯誤,但是那是因為我創造了一個has_one
關系,后來被刪除,它的模型had_one
的。 我只是忘了從剩余的模型中刪除has_one
關系。
就我而言,我命名了一個列名type
並嘗試將其值設置為UNPREPARED
。 我收到了這樣的錯誤消息:
引起:api_1 | NameError: 未初始化的常量 UNPREPARED
在 rails 中,保留了列type
:
ActiveRecord::SubclassNotFound: 單表繼承機制無法定位子類:'UNPREPARED'。 引發此錯誤是因為列“類型”保留用於在繼承的情況下存儲類。 如果您不打算將此列用於存儲繼承類或覆蓋 Food.inheritance_column 以使用另一列存儲該信息,請輕松重命名此列
在Ubuntu 20.04 中處理Rails 6應用程序時,我遇到了同樣的問題。
當我使用命令啟動 rails 控制台時
rails console
然后運行下面的命令列出所有可用的角色
Role.all
我收到以下錯誤:
Traceback (most recent call last):
1: from (irb):2
NameError (uninitialized constant Role)
這是我修復它的方法:
問題是我的Role
模型使用名為Userbase
的模塊命名。 所以而不是這個:
Role.all
應該是這樣的:
Userbase::Role.all
就這樣
我希望這有幫助
嗨,我遇到了同樣的問題,我只是通過在/config/routes.rb
上指定控制器來解決它,找到放置控制器名稱的路由。
示例:我有控制器product_controller.rb
路線.rb
resource :product, controller: 'product', only: [:edit, :update]
我得到了同樣的錯誤。 這些類存在命名約定問題。 我的文件名為checkitemgroup_query.rb
但我將 class 初始化為CheckitemGroupQuery
。 通過將 class 名稱替換為CheckitemgroupQuery
,我的問題得到解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.