【问题标题】:NameError: uninitialized constant <Model>:<column_name>NameError: 未初始化的常量 <Model>:<column_name>
【发布时间】:2014-05-10 02:13:56
【问题描述】:

我在我的 Rails 设置中遇到了一个奇怪的问题,这让我百思不得其解。 我正在尝试在用户和书籍之间创建以下关系

class Book < ActiveRecord::Base   
  has_many :follows, :dependent => :destroy
  belongs_to :user
end

class Follow < ActiveRecord::Base
  attr_accessible :user_id,
                  :book_id,
                  :updated_at
  belongs_to :user
  belongs_to :book_id
  validates :user_id, presence: true
  validates :book_id, presence: true
end

class User < ActiveRecord::Base   
  has_many :books, :dependent => :destroy
  has_many :follows, :dependent => :destroy
end

直观地说,一个用户可以拥有许多书籍,并且可以关注其他书籍(来自其他用户) 我希望我的关注模型跟踪这种关系

这是我的数据库的设置方式 (PostgreSQL)

# \d follows
                                     Table "public.follows"
   Column   |            Type             |                      Modifiers                       
------------+-----------------------------+------------------------------------------------------
 id         | integer                     | not null default nextval('follows_id_seq'::regclass)
 user_id    | integer                     | 
 book_id    | integer                     | 
 created_at | timestamp without time zone | 
 updated_at | timestamp without time zone | 
Indexes:
    "follows_pkey" PRIMARY KEY, btree (id)
    "index_follows_on_book_id_and_user_id" UNIQUE, btree (book_id, user_id)
    "index_follows_on_book_id" btree (book_id)
    "index_follows_on_user_id" btree (user_id)

最后,当我打开 Rails 控制台并尝试创建一个 Follow 实例并分配一个 book_id 值时,它会在标题中吐出消息:

导轨 c 加载开发环境(Rails 4.0.0.rc1) 2.0.0p247 :001 > f = Follow.new => # 2.0.0p247:004 > f.book_id = 48 NameError: 未初始化的常量 Follow::BookId 来自/Users/minghuazhao/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0.rc1/lib/active_record/inheritance.rb:125:incompute_type' from /Users/minghuazhao/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0.rc1/lib/active_record/reflection.rb:178:inklass' 来自/Users/minghuazhao/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0.rc1/lib/active_record/associations/association.rb:207:in raise_on_type_mismatch!' from /Users/minghuazhao/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0.rc1/lib/active_record/associations/belongs_to_association.rb:11:inreplace' 来自/Users/minghuazhao/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0.rc1/lib/active_record/associations/singular_association.rb:17:in writer' from /Users/minghuazhao/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0.rc1/lib/active_record/associations/builder/association.rb:78:inbook_id=' 来自 (irb):4 来自 /Users/minghuazhao/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0.rc1/lib/rails/commands/console.rb:90:in start' from /Users/minghuazhao/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0.rc1/lib/rails/commands/console.rb:9:instart' 来自/Users/minghuazhao/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0.rc1/lib/rails/commands.rb:66:in <top (required)>' from bin/rails:4:inrequire' 从 bin/rails:4:in `'

如果有人能说出发生了什么并给出一些提示,那就太棒了。 提前致谢。

【问题讨论】:

  • 喜欢 'model::field' 是谷歌搜索。感谢您提供一个不错的问题标题 :) 发表评论以帮助其他可能在谷歌上搜索此类问题以获取此错误消息的人。

标签: ruby-on-rails ruby postgresql nameerror


【解决方案1】:

变化:

belongs_to :book_id

belongs_to :book

另外,您真的希望将 book_id 和 user_id 标记为可访问吗?这可能允许使用精心设计的帖子请求更新这些字段。

【讨论】:

  • 哇...我感觉好笨哈哈!不敢相信我错过了那个额外的“_id”!!!我添加了 attr_accessible 以便能够创建像 u.follows.build(book_id: b.id) 这样的“关注”关系,其中 u 是用户实例,b 是书籍实例
  • @mhz - 你可以对f = u.follows.build; f.book = book 做同样的事情。将外键设置为可访问是有风险的。
  • 啊,我不知道还有其他方法。谢谢。
猜你喜欢
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
相关资源
最近更新 更多