NameError: uninitialized constant -- activerecord

user1839823 picture user1839823 · Nov 21, 2012 · Viewed 7.7k times · Source

I have two classes, Number and Freebie:

class Number < ActiveRecord::Base
  belongs_to :account
  has_many :freebies

end

class Freebie < ActiveRecord::Base
  belongs_to :number

  attr_accessible :name, :data

  has_attached_file :data, :path => "freebies/:id_partition/:filename"

  def to_s
    name
  end
end

All of my other classes with a has_many and belongs_to relationship work fine, but when I call something like:

n = Number.last
n.freebies.create

I get this error:

NameError: uninitialized constant Number::Freeby
    from /Users/Robby/.rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.8/lib/active_record/inheritance.rb:111:in `compute_type'
    from /Users/Robby/.rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.8/lib/active_record/reflection.rb:172:in `klass'
    from /Users/Robby/.rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.8/lib/active_record/associations/collection_association.rb:148:in `transaction'
    from /Users/Robby/.rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.8/lib/active_record/associations/collection_association.rb:431:in `create_record'
    from /Users/Robby/.rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.8/lib/active_record/associations/collection_association.rb:119:in `create'
    from /Users/Robby/.rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.8/lib/active_record/associations/collection_proxy.rb:46:in `create'
    from (irb):20
    from /Users/Robby/.rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.8/lib/rails/commands/console.rb:47:in `start'
    from /Users/Robby/.rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.8/lib/rails/commands/console.rb:8:in `start'
    from /Users/Robby/.rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.8/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

I've had some other problems with the Freebie class because it ends with ie and Rails tries to make the singular version "Freeby" instead of Freebie. Still, I'm not sure why this isn't working.

Answer

Zajn picture Zajn · Nov 21, 2012

Rails automatically tries to infer the plural version of a word from its singular form and vice-versa. You might want to look into overriding the default inflection rules.

Try something similar to the answer in this Stackoverflow question.