Using of module and "Is not missing constant" error

Joined
Feb 4, 2010
Messages
28
Reaction score
0
Hi,

I have some trouble using module. I'm working on a rails project, but I
think it's concerning Ruby in general.

I get this kind of error 'Module is not missing constant Klass!'

I have folders looking like this :
x/y/klass.rb.

In klass my code is looking something like this :
module x
module y
class klass
end
end
end

In another file :
module x
class Anotherklass
#some method
end
end

When I use once in my methode y::klass everything works fine.
But if I use it twice, the seconde line raise the error : "x is not
missing constant klass".

I tried to load manually the file with require call but it doesn't
change anything.
It's like after the first call, ruby know that Klass is nested into y
but when I use only Klass, ruby raise that he doesn't know Klass ...

I really dunno what to do to solve this. I'm looking arround require and
include.

Thanks for reading
 
J

Josh Cheek

[Note: parts of this message were removed to make it a legal post.]

Hi,

I have some trouble using module. I'm working on a rails project, but I
think it's concerning Ruby in general.

I get this kind of error 'Module is not missing constant Klass!'

I have folders looking like this :
x/y/klass.rb.

In klass my code is looking something like this :
module x
module y
class klass
end
end
end

In another file :
module x
class Anotherklass
#some method
end
end

When I use once in my methode y::klass everything works fine.
But if I use it twice, the seconde line raise the error : "x is not
missing constant klass".

I tried to load manually the file with require call but it doesn't
change anything.
It's like after the first call, ruby know that Klass is nested into y
but when I use only Klass, ruby raise that he doesn't know Klass ...

I really dunno what to do to solve this. I'm looking arround require and
include.

Thanks for reading
Classes and modules are constants, so their names need to begin with
Uppercase Letters.
 
Joined
Feb 4, 2010
Messages
28
Reaction score
0
Josh said:
Classes and modules are constants, so their names need to begin with
Uppercase Letters.

Yes, sorry for my exemple, my real code follow of course the naming
style.
 
B

Brian Candler

Yes, sorry for my exemple, my real code follow of course the naming
style.

So show a real piece of Ruby code which replicates the problem -
something we can paste into a file and run for ourselves.

Often, in boiling down a problem into a simple test case like that,
you'll discover what the problem is. And if you don't, you will have
made it much easier for others to determine what the problem is.
 
Last edited by a moderator:
Joined
Feb 4, 2010
Messages
28
Reaction score
0
Brian said:
So show a real piece of Ruby code which replicates the problem -
something we can paste into a file and run for ourselves.

Often, in boiling down a problem into a simple test case like that,
you'll discover what the problem is. And if you don't, you will have
made it much easier for others to determine what the problem is.
Sure.

I create a test app with this code.
In app/controller/local/class_generator_controller.rb :

class Local::VerticalGeneratorController < ApplicationController
def index
@models = VerticalBuilder::Vertical.list
@models = VerticalBuilder::Vertical.list #second call raise an
exception
end
end

In lib/local/vertical_builder/vertical.rb :
module Local
module VerticalBuilder
class Vertical
def self.list
[]
end
end
end
end

I get the same error when I call
http://localhost:3000/local/vertical_generator :
Local is not missing constant VerticalBuilder!
It seams that Ruby try to load each time the Constant instead of look
into already loaded...
 
J

Josh Cheek

[Note: parts of this message were removed to make it a legal post.]

Brian said:
So show a real piece of Ruby code which replicates the problem -
something we can paste into a file and run for ourselves.

Often, in boiling down a problem into a simple test case like that,
you'll discover what the problem is. And if you don't, you will have
made it much easier for others to determine what the problem is.
Sure.

I create a test app with this code.
In app/controller/local/class_generator_controller.rb :

class Local::VerticalGeneratorController < ApplicationController
def index
@models = VerticalBuilder::Vertical.list
@models = VerticalBuilder::Vertical.list #second call raise an
exception
end
end

In lib/local/vertical_builder/vertical.rb :
module Local
module VerticalBuilder
class Vertical
def self.list
[]
end
end
end
end

I get the same error when I call
http://localhost:3000/local/vertical_generator :
Local is not missing constant VerticalBuilder!
It seams that Ruby try to load each time the Constant instead of look
into already loaded...
I think this is going to be a Rails question about how Rails handles loading
files / environments.

But a few thoughts to look at:

What happens if you say Local::VerticalBuilder::Vertical.list ?

What happens if you run your server in production mode?

What happens if you place the code into an initializer instead of lib?
 
Joined
Feb 4, 2010
Messages
28
Reaction score
0
Josh said:
But a few thoughts to look at:
What happens if you say Local::VerticalBuilder::Vertical.list ?
It Works !

But I really would like to know why.
My class is called Local::Class name, so it belongs to the module Local
and must be able to access to all submodules, isn't it ?

The strangest thing is that without this Local:: the call work once only
like I said.
Really strange ...

Anyway, thanks for help. I can continue my project with this now.
If anyone get info about this freaky trick I would like to see the light
of truth :p
 
B

Brian Candler

I create a test app with this code.
In app/controller/local/class_generator_controller.rb :

class Local::VerticalGeneratorController < ApplicationController
def index
@models = VerticalBuilder::Vertical.list
@models = VerticalBuilder::Vertical.list #second call raise an
exception
end
end

Try rewriting this as:

module Local
class VerticalGeneratorController < ApplicationController
...
end
end

I have seen similar constant lookup problems before.

$ irb --simple-promptNameError: uninitialized constant Foo::Bar::ZZZ
from (irb):6:in `baz'
from (irb):9
from :0

Compare:

$ irb --simple-prompt123
=> nil
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,010
Latest member
MerrillEic

Latest Threads

Top