ruby - Namespaced model in Rails generating NameError: uninitialized constant -
i have folder structure this:
app/   models/     bar/       foo.rb       connection.rb     foo.rb connection.rb "abstract class" connecting database, so:
class bar::connection < activerecord::base   self.abstract_class = true   establish_connection "outsidedb_#{rails.env}" end bar/foo.rb accessing foos table outsidedb, so:
class bar::foo < bar::connection end and foo.rb accessing foos table app's db, so:
class foo < activerecord::base end from rails console if foo.first or bar::foo.first things behave expect in first entry foos table of app db , external db, respectively.
however, if try access foo within bar/foo.rb following:
class bar::foo < bar::connection   def self.test       bar::foo.first #=> works       foo.first      #=> nameerror: uninitialized constant bar::foo::foo   end    def self.other_test     foo.parent                    #=> object     foo.superclass                #=> activerecord::base     object::foo.first             #=> works     activerecord::base::foo.first #=> works, "warning: toplevel constant                                    #   foo referenced activerecord::base::foo   end end i can things working, i'm looking sounder understanding of what's going on. i'm assuming i'm missing between ruby's constant/class evaluation , rail's builtin auto-loading...
- what .parentreturning (not 'parent' class)?
- why error in .test, don't in rails console?
- why object::fooseem work? right thing do?
- why activerecord::base::foowork, warning?
- there more rails way i've done without renaming 1 of foo.rbclasses?
i'm on rails '3.2.13' , ruby 1.9.3-p194, know!
your problem can fixed with
::foo.first here ::foo indicating class foo in top namespace.
you problem comes fact, there foo class in namespace (bar) working in. should explicit.
as question why object::foo works (with warnings), it's (less) known behaviour of name lookup in ruby. please see this article more details.
Comments
Post a Comment