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?
Quelques choses à essayer:
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.
Votre fichier de modèle s'appelle-t-il "numéro_phone.rb" et se trouve-t-il dans "/ app/models"?
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.
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.
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
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
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.
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
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.
J'ai eu la même erreur. Il se trouve que dans mon échafaudage rapide, j'ai oublié le fichier model.rb.