簡體   English   中英

Rails:NameError:未初始化的常量

[英]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 控制台應自動加載所有模型。 這里發生了什么?

一些嘗試:

  1. 重啟 rails 控制台; 如果您這樣做> reload! ,則模型的更改只會被已經打開的rails控制台接收> reload! (雖然我發現這是不可預測的),或者通過重新啟動控制台。

  2. 您的模型文件是否名為“phone_number.rb”並且在“/app/models”中?

  3. 您應該仔細檢查 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 BClass 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM