2015-12-17 1 views
8

У меня есть две моделей, как следующее:Получения NameError: неинициализированная константа при попытке присвоить 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 

, если я делаю следующее, я получаю сообщение об ошибке:

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

Но если я обновлю Модель дома:

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

По какой-то причине я могу получить связанные номера, но не могу назначить новый. Что я здесь пропустил?

+0

Поскольку has_many: номера ассоциация ожидает режим номер, но у вас есть MainModule: : подмодуль :: номер. –

+0

Это то, что я думал, пока home.rooms работают правильно –

+0

сделал u try 'принадлежит_to: home, class_name: 'MainModule :: SubModule :: Home'' –

ответ

0

Как примерно следующее (я не пробовал):

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

Я забыл написать подклассы в исходном вопросе. Такой же результат. –

+0

Хорошо, я скоро удалю ответ. –

1

Вы должны убедиться, что ваши модели находятся в поддиректории директории приложения/модели в Rails. У меня есть что-то вроде этого:

$ ls -1R app/models 
    main_module 

    app/models/main_module: 
    sub_module 

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

С этой структурой, я был в состоянии сделать следующее в консоли 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

Как я уже сказал, я указываю модули как Home, так и Room для MainModule :: SubModule. Если бы я, во всяком случае, случайно разместил их в неправильных подкаталогах, Rails будет бросать LoadError задолго до того, как я столкнусь с этой проблемой. –

+0

Нравится это: «LoadError: невозможно автозагрузить константу Home, ожидается/Пользователи/Tar_Tw45/Documents/Ruby on Rails /MyApp/app/models/home.rb, чтобы определить его " –

Смежные вопросы