2015-12-17 22 views
8

Ho due modelli come la seguente:Ottenere NameError: costante inizializzata quando si cerca di assegnare belongs_to

module MainModule 
    module SubModule 
    class Home < ActiveRecord::Base 
     has_many :rooms 
    end 
    end 
end 

module MainModule 
    module SubModule 
    class Room < ActiveRecord::Base 
     belongs_to :home 
    end 
    end 
end 

se faccio il seguente, ottengo un errore:

> home.rooms << room 
=> NameError: uninitialized constant Room 
(Failed) 
> home.rooms 
=> #<ActiveRecord::Associations::CollectionProxy []> 
(Success) 

Ma se aggiorno il modello Home:

.. 
has_many :rooms, class_name: "MainModule::SubModule::Room" 
.. 
> home.rooms << room 
=> #<MainModule::SubModule::Room id: 1, ...> 

Per qualche motivo, posso ottenere le camere associate ma non posso assegnarne una nuova. Cosa mi sono perso qui?

+0

Perché has_many: associazione camere si aspetta una modalità in camera, ma bisogna MainModule: : modulo :: camera. –

+0

Questo è quello che ho pensato fino a quando home.rooms funziona correttamente –

+0

hai provato 'belongs_to: home, class_name: 'MainModule :: SubModule :: Home'' –

risposta

0

Come qui di seguito (non ho provato):

module MainModule 
    module SubModule 
    class Home < ActiveRecord::Base 
     has_many :rooms 
    end 
    end 
end 

module MainModule 
    module SubModule 
    class Room < ActiveRecord::Base 
     belongs_to :home 
    end 
    end 
end 
+0

Ho dimenticato di scrivere la sottoclasse nella domanda originale. Lo stesso risultato comunque. –

+0

Ok, cancellerò la mia risposta a breve. –

1

Avrai bisogno di assicurarsi che i modelli sono in sottodirectory della cartella app/modelli in Rails. Ho qualcosa di simile:

$ ls -1R app/models 
    main_module 

    app/models/main_module: 
    sub_module 

    app/models/main_module/sub_module: 
    home.rb 
    room.rb 

Con tale struttura, sono stato in grado di fare quanto segue nella console Rails:

irb(main):001:0> home = MainModule::SubModule::Home.new 
=> #<MainModule::SubModule::Home id: nil, name: nil, created_at: nil, updated_at: nil> 
irb(main):002:0> home.name = 'Home' 
=> "Home" 
irb(main):003:0> home.save 
=> true 
irb(main):004:0> room = MainModule::SubModule::Room.new 
=> #<MainModule::SubModule::Room id: nil, name: nil, home_id: nil, created_at: nil, updated_at: nil> 
irb(main):005:0> room.name = 'Room' 
=> "Room" 
irb(main):006:0> room.save 
=> true 
irb(main):007:0> home.rooms << room 
=> [#<MainModule::SubModule::Room id: 1, name: "Room", home_id: 1, created_at: "2016-01-06 14:28:06", updated_at: "2016-01-06 14:28:13">] 
+0

Come ho detto, specificando i moduli sia di Home che di Room come MainModule :: SubModule. Se, in ogni caso, mi è capitato di inserirli in sottodirectory sbagliate, Rails getterà LoadError molto prima che mi imbatti in questo numero –

+0

In questo modo, "LoadError: Impossibile caricare automaticamente la costante, previsto/Utenti/Tar_Tw45/Documenti/Ruby on Rails /MyApp/app/models/home.rb per definirlo " –