【问题标题】:Getting NameError: uninitialized constant when trying to assign belongs_to获取NameError:尝试分配belongs_to时未初始化的常量
【发布时间】:2015-12-17 09:29:15
【问题描述】:

我有两个模型,如下所示:

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)

但如果我更新 Home 模型:

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

由于某种原因,我可以获得关联的房间,但无法分配新房间。我在这里错过了什么?

【问题讨论】:

  • 因为 has_many :rooms 关联需要 Room 模式,但您有 MainModule::SubModule::Room。
  • 在 home.rooms 正常工作之前我就是这么想的
  • 你试过belongs_to :home, class_name: 'MainModule::SubModule::Home'
  • @AsadAli 是的,我做到了。问题是,为什么在不指定类名的情况下,调用关联对象有效但分配关联对象无效。

标签: ruby-on-rails activerecord associations


【解决方案1】:

您需要确保您的模型位于 Rails 中 app/models 目录下的子目录中。我有这样的事情:

$ 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">]

【讨论】:

  • 就像我说的,我将 Home 和 Room 的模块都指定为 MainModule::SubModule。无论如何,如果我碰巧将它们放在错误的子目录中,Rails 会在我遇到这个问题之前很久就抛出 LoadError
  • 像这样,“LoadError: Unable to autoload constant Home, expected /Users/Tar_Tw45/Documents/Ruby on Rails/MyApp/app/models/home.rb 来定义它”
【解决方案2】:

下面的怎么样(我没试过):

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

【讨论】:

  • 我忘了在原始问题中写子类化。结果还是一样。
  • 好的,我会尽快删除我的答案。
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 2015-10-29
  • 1970-01-01
相关资源
最近更新 更多