Что такое gem?

При разработке приложения на Ruby, использование gem'ов (gem - в переводе означает "драгоценный камень", правильно читается как джем, но многие почемуто говорят "гемы") не редкость. По факту gem - это готовый набор классов облегчающий работу программиста, иными словами "сторонняя библиотека". Таким образом программист сосредотачивается на основных тонкостях своей писанины. Как результат - увеличивается скорость разработки, и как побочный эффект программист не изобретает велосипед.
.gem - это архив, внутри которого, помимо самой библиотеки находится файл спецификации, который помимо всего прочего включает в себя информацию:
- версия библиотеки
- зависимости от других gem'ов
- описание gem'a
Gem'ы создаются независимыми программистами, при разработки типовых задач. Устанавливаются в систему одноимённой утилитой gem (она устанавливается вместе с RVM).

Искать нужные джемы стоит на сайте проекта rubygems.org (RubyGems - менеджер пакетов (джемов)), на гитхабе и на независимом проекте ruby-toolbox.com

Раньше, до того как появился менеджер пакетов RubyGems, джемы были равномерно рассосредоточены по интернету. Нужно было найти сайт интересующего джема, найти ссылку на скачивание архива, скачать, распаковать, проанализировать все зависимости текущего джема, лезть опять в гугл, искать зависимые джемы, находить, опять качать, опять смотреть на зависимости, и при всем при этом учитывать версии каждого джема, ибо один джем зависит от другого джема конкретной версии, и не факт что он будет работать с более новой или темболее более старой версией. И после всех этих плясок с бубном, нужно было все это проинсталлировать. Короче был пиздец. И слава богам, - появился RubyGems, менеджер пакетов который автоматизировал работу с джемами.
Gemset'ы
Поскольку джемы разных версий могут конфликтовать, под каждый проект принято создавать отдельные  джемсеты, которые представляют из себя набор определенных джемов, с определенными версиями, заточенными под нужную вресию руби. Давай, специально под данный учебник создадим джемсет samouchka:
$ rvm use 2.0.0@samouchka --create --default

Где:
- use - начать использовать указанный джемсет
- 2.0.0 - версия руби (мы же помним да, что RVM позволяет работать на одном сервере с разными версиями руби)
- samouchka - имя джемсета
- --create - создать джемсет
- --default - использовать этот джемсет по умолчанию. В итоге, при каждом запуске окна терминала, только что созданный джемсет будет выбран автоматически.
проверить текущий джемсет можно командой
$ rvm current

Установка gem'ов
$ gem install sinatra

Gem sinatra - микрофреймворк
Легким движением пальцев, фрейворк sinatra установлен. По умолчанию устанавливается самая последняя версия джема.  Операция gem install скачивает архив и распаковывает его, проверяет зависимости, учитывая версии, и при необходимости скачивает и их тоже, не забыв при этом обновить для себя файлик спецификации. В состав джемов могут входить также и исполняемые файлы (я думаю bundler и rake наиболее известные). Команда gem install отлично подходит, когда к приложению подключается 1-2 джема. Но мы же не хотим плясать с бубном когда нам нужно установить 10-20 разных джемов, при всем при этом мы хотим чтобы одна часть джемов работала в окружении разработки, а другая в продакшне. На помощь приходит bundler

Bundler и Gemfile
Bundler - это джем, который занимается установкой джемов. Файл Gemfile является неотделимым атрибутом для работы bundler'a. Gemfile представляет из себя обычную программу на Ruby,  которая описывает установщику какие джемы каких версий и для чего нам нужны.
Вот пример того, как может выглядить Gemfile:
source 'http://rubygems.org'

gem 'sinatra',  '~> 1.4.4'
gem 'mongo',    '1.9.2'
gem 'bson'      '1.9.2'
gem 'bson_ext', '1.9.2'

gem 'unicorn', :group => :production

group :development, :test do
  gem 'shotgun'
end

group :test do
    gem 'rspec', '>= 2.6'
end

Чтобы установить указанный джемы, достаточно перейти в каталог с Gemfile'ом и набрать в консоле команду
$ bundle install

Помимо установки всех джемов в одну строку, bundle разрешает все конфликты зависимостей и записывает результат работы в файл Gemfile.lock, у меня он выглядит так:
GEM
  remote: http://rubygems.org/
  specs:
    bson (1.9.2)
    bson_ext (1.9.2)
      bson (~> 1.9.2)
    kgio (2.9.2)
    mongo (1.9.2)
      bson (~> 1.9.2)
    rack (1.5.2)
    rack-protection (1.5.2)
      rack
    raindrops (0.13.0)
    shotgun (0.9)
      rack (>= 1.0)
    sinatra (1.4.4)
      rack (~> 1.4)
      rack-protection (~> 1.4)
      tilt (~> 1.3, >= 1.3.4)
    tilt (1.4.1)
    unicorn (4.8.2)
      kgio (~> 2.6)
      rack
      raindrops (~> 0.7)

PLATFORMS
  ruby

DEPENDENCIES
  bson
  bson_ext
  mongo
  shotgun
  sinatra
  unicorn


Bundle имеет еще ряд фич, таких как например установка джемов прямо из репозитария гитхаба, или групповой require. Про все это можно почитать здесь http://www.ruby-doc.org/docs/ruby-doc-bundle/