This guide lists a few valuable gems for your first Rails Project.
After reading this guide you will
Code reuse is a deciding factor for programmer productivity. In Ruby
the unit of reuse is called a
rubygems is the package manager for ruby,
it let's you install gems on your system.
A gem has a name (e.g.
rake) and a version number (e.g.
It can be written in plain ruby or sometimes in ruby and c. Many gems
depend on system libraries that need to be installed before the gem can
be installed. For example the rmagick
gem for image manipulation needs the library
So most of the time installing a gem is as simple as
> gem install rails_best_practices Successfully installed rails_best_practices-1.15.7 Parsing documentation for rails_best_practices-1.15.7 Installing ri documentation for rails_best_practices-1.15.7 Done installing documentation for rails_best_practices after 2 seconds 1 gem installed
But sometimes you have to do other installations first. On your development machine this might look like this:
# install node on a mac > brew install nodejs > gem install uglifier
Sometimes you need to set include paths when compiling the c-part of the gem, e.g.:
> gem install eventmachine ... error messages ... In file included from binder.cpp:20: ./project.h:116:10: fatal error: 'openssl/ssl.h' file not found #include <openssl/ssl.h> ^ > brew install openssl > gem install eventmachine -- --with-cppflags=-I/usr/local/opt/openssl/include
In production you probably have to deal with Linux, and you may not have the right permissions to install system libraries. A typical example would be:
$dev> ssh my.production.machine $production> sudo apt-get install libmagick++-dev $production> gem install rmagick $production> gem install paperclip
Now that you have installed the gem once by hand you can be sure that it can also be reinstalled by bundler.
For a rails project you will be using a lot of gems. This will lead to two problems:
Bundler is the name of the tool that saves us from dependency hell.
Bundler is itself a gem, so you install it with
gem install bundler.
Beware: the command you will be using called
bundle, not bundler.
There is how it works: In every ruby project you write
Gemfile in which you define which gems and (to a certain degree) which versions you want.
When you run
bundle install bundler will:
The lock-file contains a complete list of all the gems necessary for your project, and their version numbers. These are now locked down, and will not change!
When deploying to a new development machine or the production server,
bundle install and the exact same versions are now installed.
In the Gemfile you can specify which versions should be used. But don't overdo it! Bundler does a good job picking versions, if you specify every version number by hand you are doing too much work.
Some examples of the different ways of specifying version number and source:
# Gemfile source 'https://rubygems.org' ruby '2.3.1' gem 'rails', '~> 5.0.0', '>= 184.108.40.206' gem 'sqlite3' gem 'puma', '~> 3.0'
~> will only allow an increase in the
last (right most) number, so
~> 5.0.0 does allow
220.127.116.11 but not
This is called a pessimistic version constraint, read more about
it in the rubygem documentation.
The configuration for a gem is found in the initializer directory,
for example for
devise the configuration file would be
A gem may install new generators for rails, run
rails generate to see a list
of available generators.
A gem may install rake tasks, run
rails -T to see a list.
This list was inspired by the Rails Rumble gem teardown and coodbeerstartups "Must Have Gems for Development Machine in Ruby on Rails ".
After file upload you might want to resize or crop your images automatically. This is traditionally done with the library ImageMagick:
You might also want to know how to use ImageMagick on the UNIX commandline:
You don't want the database keys to be visible in your URLs? Use Friendly IDs instead:
Letting users enter HTML is a dangerous idea - it's really hard to avoid the security problems. An alternative is to let them enter a simpler markup language, like Markdown. You store the markdown in your database, and convert it to HTML when displayed using a gem:
Or use the builtin editor (since rails 6):
Do you need to displaying a lot of items? Use a pagination gem to go through them page by page:
You need to filter objects shown by the index action?
You need to search in more than just one attribute of your model? use a search gem:
If you want to give users an overview of what happened recently you can use an activity stream, similar to what you see in facebook.
Create a Backend for manipulating data with a few lines of code:
To send mail from Rails use ActionMailer.
To see the generated mails in your web browser instead of sending them, use the gem letter_opener
To receive Mail use ActionMailbox
This might be handy for downloading from Webpages or APIs
sometimes you want to convert longitude/latitude coordinates to street addresses, or the reverse
Use postgres's inbuilt geographical features: