I have some behavior in my controller that I pulled out into a module in order to test better and re-use it in a few places. Two questions about this:
config/initializers/
directory. That seems a little suspect to me though. lib/
?include
in my controllers?Thank you kindly sirs.
Mixins in Ruby allows modules to access instance methods of another one using include method. Mixins provides a controlled way of adding functionality to classes. The code in the mixin starts to interact with code in the class. In Ruby, a code wrapped up in a module is called mixins that a class can include or extend.
The more nuanced answer. The truth is that you can put your modules anywhere. Personally, my main use for modules is to create namespaces for my Active Record models to help keep things organized. Those module definitions just end up in the same files as my Active Record models.
The method definitions look similar, too: Module methods are defined just like class methods. As with class methods, you call a module method by preceding its name with the module's name and a period, and you reference a constant using the module name and two colons.
Modules provide a structure to collect Ruby classes, methods, and constants into a single, separately named and defined unit. This is useful so you can avoid clashes with existing classes, methods, and constants, and also so that you can add (mix in) the functionality of modules into your classes.
lib/
is an excellent place for modules; much better than config/initializers/
--at least in my opinion. If it's several modules, or one large one, you can also consider making it a plugin and placing it in vendor/plugins
.
If you put it in lib/
, you'll need to manually require
the file. Rails, by default, does not autoload files in the lib/
directory. You can place the require in one of your config files.
I usually put my additional autoloads in config/application.rb
. Something like this should do the trick (assuming that your .rb
file is in a directory called lib/my_module
):
config.autoload_paths += Dir["#{Rails.root}/lib/my_module"]
You have to make sure that your module is an actual module
and not a class
. Then, you can simply include it:
# lib/my_module/foobar.rb module Foobar def foobar "Hello world!" end end # app/models/my_model.rb class MyModel < ActiveRecord::Base include Foobar end # rails console >> obj = MyModel.first => #<MyModel id: 1, ...> >> obj.id => 1 >> obj.foobar => "Hello world!"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With