Ruby on Rails / 5 гемов на все случаи жизни

в 13:55, , рубрики: rails, useful gems, метки: ,

В блоге про Django я периодически вижу посты с обзорами интересных расширений для этого фреймворка. Идея мне понравилась, и я решил, что было бы неплохо сделать похожий цикл заметок и о Ruby on Rails.
За последние 9 месяцев работы с RoR у меня накопился небольшой список гемов, которые существенно упрощают жизнь разработчику, и которые я бы мог посоветовать для решения тех или иных задач. В этой статье я хочу рассказать о пяти из них.
foreigner

Небольшой, но очень полезный гем для создания внешних ключей у таблиц. Он добавляет к миграциям два новых метода — add_foreign_key и remove_foreign_key.
Так, например, если нужно добавить ключ от таблицы comments к таблице users, нужно сделать следующее:
class CreateComments < ActiveRecord::Migration
def change
create_table :comments do |t|
# …
t.references :user
# ...
end

# …
add_foreign_key :comments, :users
end
end

Страница на Github
pacecar

Довольно интересный гем от ребят из thoughtbot. Суть его в том, что он анализирует модель, к которой вы его подключаете, и на основе этого анализа добавляет различные scope-методы.
Предположим, у вас есть модель Post, у которой есть поля в таблице: title, content, created_at, updated_at. И есть связь has_many :comments. Добавим Pacecar в нашу модель:
class Post < :destroy
end

После этого нам станут доступны, например, такие скоупы:
Post.title_matches('Some title') # LIKE "%term%"
Post.created_at_before(5.days.ago) # Посты, созданные не позднее 5 дней назад
Post.maximum_comments # Пост наибольшим количеством комментариев

Гем добавляет довольно много полезных методов, более подробно можно ознакомиться на Github.Страница на Github
settingslogic

Существует довольно большое кол-во гемов, решающих проблему настроек в приложении. Cамой удачной, на мой взгляд, реализацией, является Settingslogic от небезызвестного Бена Джонсона. Простой, легковесный, использует YML-файл.
Автор гема предлагает использовать класс Settings и хранить его рядом с моделями (app/models/settings.rb).
class Settings < Settingslogic
source "#{Rails.root}/config/application.yml"
namespace Rails.env
end

Файл настройками в данном случае хранится в config/application.yml:
defaults: &defaults
default_email: admin@example.com

development:
<<: *defaults

test:
<<: *defaults

production:
<<: *defaults

Настройки будут вызываться относительно текущего Rails-окружения. Обращаться к ним мы можем через класс Settings.
Settings.default_email # admin@example.com

Страница на GithubДокументация
letter_opener

Гем-заглушка за авторством Райна Бейтса, без которого я уже никак не могу обходиться. Смысл работы крайне прост — мы указываем в конфиге приложения (например, в config/enviroments/development.rb), что в качестве способа доставки почты хотим использовать letter_opener.
config.action_mailer.delivery_method = :letter_opener

После этого вся исходящая почта начинает складываться в папке /tmp/letter_opener, а каждое письмо после сразу после отправки открывается в новой вкладке браузера. Просто и удобно.Страница на Github
immortal

Гем от разработчиков Teambox, который позволяет вместо удаления записи помечать ее как 'deleted'. Бывает очень полезно, если мы хотим оградить неосторожного пользователя от потери данных.
Для использования гема нужно добавить поле deleted к таблице, записи которой хотим сделать «бессмертными»:
class AddDeletedToTasks << ActiveRecord::Migration
def change
add_column :tasks, :deleted, :boolean
end
end

Затем подключить его в нужной модели:
class Task << ActiveRecord::Base
include Immortal
end

Теперь каждая запись в модели Task вместо полного удаления из бд будет помечена как удаленная.Страница на Github
That's all!

На этом я заканчиваю эту заметку, надеюсь вы нашли в ней что-то полезное для себя.


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js