Forum: Ruby on Rails [ActiveRecord] strange issue, would like to understand before I wake up...

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Ee0293412faca21e4ebf3326ed9d5f8c?d=identicon&s=25 Kad Kerforn (kadoudal)
on 2009-04-08 14:12
(Received via mailing list)
running 2.3.2

simple case   (db table created :  'emails'  with a :type field)

I have the following Email model

class Email < ActiveRecord::Base
....
end

class RequestEmail < Email
....
end

TESTING in the console :
script/console
Loading development environment (Rails 2.3.2)
>> Email.new
=> #<Email id: nil, sender_email: nil, subject: nil, content: nil,
user_id: nil, created_at: nil, updated_at: nil, title: "mr",
firstname: "", lastname: "Anonymous", type: nil>    (Note : type is
nil, not "Email" ... ?)
>> RequestEmail.new
=> #<RequestEmail id: nil, sender_email: nil, subject: nil, content:
nil, user_id: nil, created_at: nil, updated_at: nil, title: "mr",
firstname: "", lastname: "Anonymous", type: "RequestEmail">
>> exit

now TESTING again..
script/console
Loading development environment (Rails 2.3.2)
>> RequestEmail.new
NameError: uninitialized constant RequestEmail
...const_missing

I'll appreciate some feedback , should I buy a 2nd glass ?  LOL

thanks
Ee0293412faca21e4ebf3326ed9d5f8c?d=identicon&s=25 Kad Kerforn (kadoudal)
on 2009-04-08 14:39
(Received via mailing list)
found a trcik , but I don't understand why ....

In my ApplicationController
require_dependency 'email'
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2009-04-08 17:09
(Received via mailing list)
On 8 Apr 2009, at 13:11, Erwin wrote:
> => #<RequestEmail id: nil, sender_email: nil, subject: nil, content:
>
> I'll appreciate some feedback , should I buy a 2nd glass ?  LOL
>

If you try an eval a constant that does not exist const_missing is
called (which by default raises NameError)
Rails implements a const_missing that tries to load the file
containing the constant for you. Rails can't guess where you've put
your models, so this only works if you stick to the conventions:
email.rb contains Email, FooController is in foo_controller.rb etc.

If you use Email before RequestEmail then email.rb is loaded (which
defines both those classes) because Rails knows to load email.rb is
const_missing triggers on Email. WHen you do things the other way
round rails does not know what to do with RequestEmail since there is
no request_email.rb. require_dependency works because it loads email.rb

Fred
This topic is locked and can not be replied to.