Can't reference module in /lib/foo

I tried creating a module in /lib/my_foo/foo_bar.rb called module
MyFoo::FooBar. Inside that module I defined a method getFoo(). I
modified application.rb and added the line config.autoload_paths +=
%W(#{Rails.root}/lib).

When I tried to access MyFoo::FooBar.getFoo() in my controller I got the
following error:
undefined method `getFoo’ for MyFoo::FooBar:Module

I realized that I didn’t make getFoo a class method so I tried changing
the method definition to MyFoo::FooBar.getFoo(), but then I got the
following error:

syntax error, unexpected ‘.’, expecting ‘\n’ or ‘;’
def MyFoo::FooBar.getFoo()

I then tried changing the method definition to self.getFoo() and
everything works fine. I also tried moving foo_bar.rb directly into
/lib, changed the module name to FooBar and the method definition to
FooBar.getFoo() and that also worked. My question is why? I assume I
just don’t have the correct syntax for specifying the module name when
it’s in one or more sub-directories off of /lib instead of directly in
/lib, but I can’t figure out what the correct syntax should be.

I’m fine with using “self”, but I’d like to understand what I’m doing
wrong.

On Mar 26, 2:39am, Patrick C. [email protected] wrote:

the method definition to MyFoo::FooBar.getFoo(), but then I got the
it’s in one or more sub-directories off of /lib instead of directly in
/lib, but I can’t figure out what the correct syntax should be.

I’m fine with using “self”, but I’d like to understand what I’m doing
wrong.

You’re finding the module fine (if you weren’t the error you’d get
something along the lines of uninitialized constant MyFoo), you’re
just not calling the method right.

given

module Foo
def bar
end
end

Then you can’t do Foo.bar, it just doesn’t work that way (it’s like
trying to call a classes instance method on the class itself. Doing
def self.bar or def Foo.bar makes it a singleton method, so you can
then do Foo.bar

with a module nested in another you can’t write

module Foo
module Bar
def Foo::Bar.foo
end
end
end

it’s just not syntactically valid. You can write

module Foo
module Bar
def Bar.foo
end
end
end

which does create Foo::Bar.foo

Fred

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs