ruby on rails 4 - software - NameError: constante sin inicializar(rieles)
ruby on rails software (8)
Algunas cosas para probar:
Reinicie la consola de rieles; los cambios en sus modelos solo serán recogidos por una consola de rieles que ya está abierta si lo hace
> reload!
(aunque he encontrado que esto es impredecible), o reiniciando la consola.¿Su archivo de modelo se llama "phone_number.rb" y está en "/ app / models"?
Debería verificar la opción "--sandbox" en el comando de la consola de Rails. AFAIK, esto evita los cambios. Pruébalo sin el interruptor.
Tengo un modelo simple llamado PhoneNumber:
class PhoneNumber < ActiveRecord::Base
validates :pnumber, presence: true, on: :create #=> { :message => " cannot be blank" }
validates :pnumber, numericality: true, on: :create
end
Voy a la carpeta raíz de la aplicación (la que contiene la subcarpeta de la aplicación) e inicio la consola:
rails console --sandbox
Cuando intento crear un número de teléfono vacío (quiero obtener un mensaje de error ya que la validación fallará) Recibo el siguiente mensaje de error:
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
Parece que la consola no es consciente del modelo. En ruby normal, debe ''requerir'' el archivo que contiene la clase, pero pensé que la consola de los rieles cargaría automáticamente todos los modelos. ¿Que esta pasando aqui?
Comencé a tener este problema después de actualizar de Rails 5.1 a 5.2
Se resolvió con:
spring stop
spring binstub --all
spring start
rails s
Estaba recibiendo el error:
NameError: uninitialized constant
Luego me di cuenta de que accidentalmente había creado un modelo plural, así que volví y cambié el nombre del archivo del modelo a singular y también cambié el nombre de la clase en el archivo del modelo a singular y eso lo resolvió.
Me encontré con esto también con un archivo directamente en el directorio de models
, y resulta que no estaba cargando correctamente el código al inicio. Pude solucionar el problema configurando config.eager_load = true
en mi archivo development.rb. Esto hizo que la clase estuviera disponible para mí en la consola.
Si ninguno de los anteriores funciona, también tengo un enfoque diferente, como me sucedió en un escenario real.
Más específicamente utilizando archivos de Ruby generados automáticamente desde Thrift .
En mi situación, tuve un Module
con varias clases, por lo que el orden es importante en este caso:
Class A
hace uso de la Class B
en el mismo módulo. Sin embargo, la Class B
se declaró después de la Class A
El simple hecho de declarar la Class B
antes de la Class A
solucionó el problema.
Similar con @ Michael-Neal.
Yo había llamado al controlador como singular. app / controllers / product_controller.rb
Cuando lo renombré como plural, se solucionó el error. app / controllers / products_controller.rb
Tuve un error similar, pero fue porque había creado una relación has_one
y, posteriormente, has_one
el modelo que had_one
. Acabo de olvidar eliminar la relación has_one
del modelo restante.
Yo tenía el mismo error. Resulta que en mis andamios apresurados dejé fuera el archivo model.rb.