web-dev-qa-db-fra.com

NameError: constante non initialisée (Rails)

J'ai un modèle simple appelé PhoneNumber:

class PhoneNumber < ActiveRecord::Base
  validates :pnumber, presence: true, on: :create #=> { :message => " cannot be blank" }
  validates :pnumber, numericality: true, on: :create
end

Je vais dans le dossier racine de l'application (celui qui contient le sous-dossier de l'application) et lance la console:

Rails console --sandbox

Lorsque j'essaie de créer un numéro de téléphone vide (je souhaite recevoir un message d'erreur car la validation échouera), le message d'erreur suivant s'affiche:

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

Il semble que la console ne soit pas au courant du modèle. En clair, vous devez "exiger" le fichier contenant la classe, mais je pensais que la console Rails devrait charger automatiquement tous les modèles. Qu'est-ce qui se passe ici?

28
Nick

Quelques choses à essayer:

  1. Redémarrez la console Rails. les modifications apportées à vos modèles ne sont prises en compte que par une console Rails déjà ouverte si vous utilisez > reload! (bien que cela soit imprévisible) ou en redémarrant la console.

  2. Votre fichier de modèle s'appelle-t-il "numéro_phone.rb" et se trouve-t-il dans "/ app/models"?

  3. Vous devriez vérifier l’option "--sandbox" dans votre commande de console Rails. Autant que je sache, cela empêche les changements. Essayez-le sans le commutateur.

43
Dan Laffan

Je recevais l'erreur:

NameError: uninitialized constant

Ensuite, j'ai remarqué que j'avais accidentellement créé un modèle au pluriel; j'ai donc renommé le fichier de modèle en singulier et modifié le nom de la classe dans le fichier de modèle en singulier, ce qui l'a résolu. 

23
crystallinering

Je me suis heurté à cela également avec un fichier directement dans le répertoire models et il s’avère que je n’ai pas chargé correctement le code au démarrage. J'ai pu résoudre le problème en définissant config.eager_load = true dans mon fichier development.rb. Cela a rendu la classe disponible pour moi dans la console

5
bradley2w1dl

J'ai commencé à avoir ce problème après la mise à niveau de Rails 5.1 à 5.2.
Il a été résolu avec:

spring stop
spring binstub --all
spring start
Rails s
3
xyz

Si rien de ce qui précède ne fonctionne, j'ai également une approche différente, comme cela m'est arrivé dans un scénario réel.

Plus spécifiquement, en utilisant des fichiers Ruby générés automatiquement à partir de Thrift .


Dans ma situation, j'avais une Module avec plusieurs classes, donc l'ordre est important dans ce cas:

Class A utilise Class B dans le même module. Cependant, Class B a été déclaré aprèsClass A.

Faire en sorte que Class B soit déclaré avant queClass A me résolve le problème.

1
Matheus Felipe

Similaire avec @ Michael-Neal.

J'avais nommé le contrôleur comme singulier. app/controllers / product_controller.rb

Lorsque j'ai renommé le pluriel, l'erreur a été résolue. app/controllers / products_controller.rb

1
Uğur Aldanmaz

J'ai eu une erreur similaire, mais c'était parce que j'avais créé une relation has_one et que j'avais ensuite supprimé le modèle dont il était had_one. J'ai juste oublié de supprimer la relation has_one du modèle restant.

0
therealrodk

J'ai eu la même erreur. Il se trouve que dans mon échafaudage rapide, j'ai oublié le fichier model.rb.

0
jared