2014-10-15 15 views
15

Ho un semplice modello chiamato PhoneNumber:NameError: costanti non inizializzate (rotaie)

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

vado nella cartella principale dell'applicazione (quello che contiene la sottocartella app) e avviare la console:

rails console --sandbox 

Quando provo a creare un vuoto PhoneNumber (voglio ottenere un messaggio di errore come la convalida deve fallire) sto ottenendo il seguente messaggio di errore:

2.0.0-p451 :001 > PhoneNumber.new 
NameError: uninitialized constant PhoneNumber 
from (irb):1 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/commands/console.rb:90:in `start' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/commands/console.rb:9:in `start' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/commands/commands_tasks.rb:69:in `console' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/commands/commands_tasks.rb:40:in `run_command!' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/commands.rb:17:in `<top (required)>' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:43:in `require' 
from /Users/nnikolo/.rvm/gems/[email protected]_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/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:32:in `loop' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:32:in `exec_app_rails' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/cli.rb:5:in `<top (required)>' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/bin/rails:9:in `require' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/bin/rails:9:in `<top (required)>' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/bin/rails:23:in `load' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/bin/rails:23:in `<main>' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/bin/ruby_executable_hooks:15:in `eval' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/bin/2.2.2.02.02.02.0.2.2.02.222222.2.02.02.0.2.2.022222222222222 

Sembra che la console non sia a conoscenza del modello. In ruby ​​semplice è necessario 'richiedere' il file contenente la classe, ma ho pensato che la console di rota caricherà automaticamente tutti i modelli. Che cosa sta succedendo qui?

risposta

36

Alcune cose da provare:

  1. riavviare la console rotaie; le modifiche ai tuoi modelli verranno rilevate solo da una console di rotaie già aperta se lo fai > reload! (anche se ho trovato che questo è imprevedibile) o riavviando la console.

  2. Il file del modello è denominato "phone_number.rb" e si trova in "/ app/models"?

  3. È necessario ricontrollare l'opzione "--sandbox" sul comando della console di rotaie. AFAIK, questo impedisce le modifiche. Provalo senza l'interruttore.

+3

Sembra che fosse il nome del file - era app/models/PhoneNumber.rb. Quando l'ho modificato in app/models/phone_number.rb il messaggio di errore è scomparso. – Nick

+0

'ricarica!' Ha funzionato per me! Sembra che alcune parti dell'inizializzazione del modello vengano memorizzate nella cache, quindi se c'è un errore in quella sezione può diventare un errore "invisibile" quando si esegue la console una seconda volta. – Meekohi

19

stavo ottenendo l'errore:

NameError: uninitialized constant

poi ho notato che avevo accidentalmente creato un modello plurale, così sono tornato e rinominato il file del modello di singolare e anche cambiato il nome della classe nel file del modello a singolare e questo lo ha risolto.

0

Ho avuto lo stesso errore. Risulta nel mio impalcatura frettoloso che ho lasciato fuori il file model.rb.

0

Se nessuno dei lavori precedenti, ho anche un approccio diverso, come è successo a me in uno scenario reale.

Più in particolare utilizzando i file Ruby generati automaticamente da Thrift.


Nella mia situazione, ho avuto un Module con diverse classi, per cui l'ordine è importante in questo caso:

Class A fa uso di Class B nello stesso modulo. Tuttavia, Class B è stato dichiarato dopoClass A.

semplicemente facendo Class B da dichiarare primaClass A risolto il problema per me.

3

Mi sono imbattuto in questo anche con un file direttamente nella directory models e risulta che non stavo caricando correttamente il codice all'avvio.Sono stato in grado di risolvere il problema impostando config.eager_load = true nel mio file development.rb. Questo ha reso la classe disponibile per me nella console

+0

Funziona per me ... grazie amico –

+1

Ecco ulteriori informazioni su questa soluzione: http://collectiveidea.com/blog/archives/2016/07/22/solutions-to-potential-upgrade-problems-in-rails- 5/ tldr; "Con Rails 5, l'autoloading ora è completamente disabilitato se config.eager_load = true." – lostphilosopher

+0

grazie! mi sono imbattuto in questo oggi, ha lavorato per me –

1

Simile a @ Michael-Neal.

Avevo chiamato il controller come singolare. app/controller/product_controller.rb

Quando l'ho rinominato come plurale, errore risolto. app/controller/products_controller.rb