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

On Tue, Mar 30, 2010 at 5:47 AM, Benoit Molenda <devanth(a)gmail.com> wrote:

> Brian Candler wrote:
> > Benoit Molenda wrote:
> >> Josh Cheek wrote:
> >>> 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.
> >
> > 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...
> --
> Posted via http://www.ruby-forum.com/.
>
>
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?

From: Benoit Molenda on
Josh Cheek wrote:
> 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
--
Posted via http://www.ruby-forum.com/.

From: Brian Candler on
> 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-prompt
>> class Foo
>> ZZZ = 123
>> end
=> 123
>> class Foo::Bar
>> def baz
>> puts ZZZ
>> end
>> end
=> nil
>> Foo::Bar.new.baz
NameError: uninitialized constant Foo::Bar::ZZZ
from (irb):6:in `baz'
from (irb):9
from :0

Compare:

$ irb --simple-prompt
>> class Foo
>> ZZZ = 123
>> end
=> 123
>> class Foo
>> class Bar
>> def baz
>> puts ZZZ
>> end
>> end
>> end
=> nil
>> Foo::Bar.new.baz
123
=> nil
--
Posted via http://www.ruby-forum.com/.