Gem dependency issue

I am developing a rails gem. It uses the gon gem so in the gemspec
file I have included

spec.add_dependency 'gon'

Then in the Gemfile for the application using my gem I have put

gem 'my_gem', :path => '/path/to/dir/containing/my_gem'

When I run bundle install I see that it includes my gem and also the
gon gem as expected.
From a view helper in the app I am calling helper method in a module
in my gem's lib folder, and in there I have code such as
gon.variable = ...
and that code throws an error
ActionView::Template::Error (undefined method `gon' for
#<PlotValuesController:0x000000067bbc30>)
where PlotValuesController is the controller in the app. If I
explicitly include gon in the Gemfile for the app then all works as
correctly.

Any suggestions as to why I have to explicitly include gon in the
application's Gemfile, when it is included anyway via the dependency
in my gem?

Gemfile.lock with and without gon included explicitly can be seen at
http://pastebin.com/vzvNgg3K

Colin

Hi,

Before using gon.variable, do you call include_gon somewhere in your view?

HTH,

:eito

Hi Colin,

I am developing a rails gem. It uses the gon gem so in the gemspec

file I have included

spec.add_dependency ‘gon’

Then in the Gemfile for the application using my gem I have put

gem ‘my_gem’, :path => ‘/path/to/dir/containing/my_gem’

When I run bundle install I see that it includes my gem and also the

gon gem as expected.

From a view helper in the app I am calling helper method in a module

in my gem’s lib folder, and in there I have code such as

gon.variable = …

and that code throws an error

ActionView::Template::Error (undefined method `gon’ for

#PlotValuesController:0x000000067bbc30)

where PlotValuesController is the controller in the app. If I

explicitly include gon in the Gemfile for the app then all works as

correctly.

Any suggestions as to why I have to explicitly include gon in the

application’s Gemfile, when it is included anyway via the dependency

in my gem?

If I recall correctly, your gem is a Rails engine. It’s a bit late and I might be wrong, but a gem doesn’t auto require other gems.

So to fix it, you need to require ‘gon’ in your gem (probably in your lib/your_gem_name.rb file).

A good example is Devise: https://github.com/plataformatec/devise/blob/master/lib/devise.rb. They do also a lot of stuff in between, but you can see the that ir requires the ORM, and Warden and other dependencies.

Hope it works,

// Marco

Any suggestions as to why I have to explicitly include gon in the
application's Gemfile, when it is included anyway via the dependency
in my gem?

Bundler's autorequire feature only requires gems listed in the Gemfile, not their dependencies. You could either require gon from within your gem, when it is required (this may or may not be appropriate ) or require it from your app.

Fred

Thanks all, that was the point I had missed, that bundler ensures all
the gems are available but only those explicitly included in Gemfile
are automatically loaded. I required gon in the gem and now all is
well.

Thanks

Colin