0
votes

I've read through many tutorials, and copied their code exactly, yet what they claim works for them doesn't work for me.

I'm making a most basic "has_many" and "belongs_to" association, but rails refuses to acknowledge any association whatsoever.

A user "has_many" emails. Emails "belong_to" user. Here's my code:

user.rb

class User < ActiveRecord::Base
  unloadable

  has_many :emails
  accepts_nested_attributes_for :emails,
    :allow_destroy => true,
  #  :reject_if     => :all_blank
end

email.rb

class Email < ActiveRecord::Base
  unloadable

  belongs_to :user
end

Then, in the console:

User.emails.build
NoMethodError: undefined method `emails' for #<Class:0x00000006c16e88>

Indeed, this "NoMethodError" persists no matter what.

As of now, my guess is that a capacitor in my hardware burnt out while I was installing rails, causing everything to work except this one thing. Or maybe it's something else :p

EDIT:

Another console attempt:

my_user = User.new
my_user.emails.build

Also results in an undefined "emails" method.

I noticed that my original user class has a bad comma at the end; removing that, I get this error:

ActiveRecord::UnknownAttributeError: unknown attribute 'user_id' for Email.
3

3 Answers

2
votes

First, you'll need to make sure you have a user_id attribute on your email table in the database. If you don't have one, you can add it with a migration.

Then, you need to tell Rails which instance of a user's emails you want to look at. So, you'll need to make sure you have a user in the database (user = User.create) and then that user's emails can be found using user.emails.

1
votes

You're confusing the concept of classes and instances. You need an instance of the User class in order to build associated relations. The error you're getting (NoMethodError: undefined method emails for #<Class:0x00000006c16e88>) hints to this, since it's telling you you're trying to call the method emails on a Class object.

Try something like:

my_user = User.new
my_user.emails.build
1
votes

Please use like this

@email = User.first.emails.build