0

I have the simple following code, which is working in a ruby (not rails) app:

require 'gmail'

Gmail.new('my_account', 'my_password') do |gmail|
end

I am able to get a connection to the Gmail account and do some stuff in there.

However, I want to use this Gem in a Rails app, and therefore I have tried adding the following into the Gemfile:

gem "ruby-gmail",         "0.2.1"
gem "mime",               "0.1"

However, when I try to use this in a rake task, like this:

task :scrap_receipts_gmail => :environment do
  Gmail.new('my_account', 'my_password') do |gmail|
    puts gmail.inspect
  end
end

I get the following error:

uninitialized constant Object::Gmail

This is solved if I add require 'gmail'. My question is:

Why would I have to require gmail, if I have already specified that in the Gemfile?

Sergio Tulentsev
  • 226,338
  • 43
  • 373
  • 367
Hommer Smith
  • 26,772
  • 56
  • 167
  • 296

1 Answers1

1

The module/class namespace has to match the directory structure. For example, in lib/foo/bar.rb, if and only if the namespace is Foo::Bar can it be auto loaded by Rails, otherwise you have to require it explicitly.

In this case, Gmail is defined as a class, which doesn't match the directory structure. If Gmail was defined as a module (namespace ::Gmail matchs directory structure), then you'll never need to explicitly require "gmail".

Tomato
  • 438
  • 2
  • 7