В блоге про Django я периодически вижу посты с обзорами интересных расширений для этого фреймворка. Идея мне понравилась, и я решил, что было бы неплохо сделать похожий цикл заметок и о Ruby on Rails.
За последние 9 месяцев работы с RoR у меня накопился небольшой список гемов, которые существенно упрощают жизнь разработчику, и которые я бы мог посоветовать для решения тех или иных задач. В этой статье я хочу рассказать о пяти из них.
Небольшой, но очень полезный гем для создания внешних ключей у таблиц. Он добавляет к миграциям два новых метода — add_foreign_key и remove_foreign_key.
Так, например, если нужно добавить ключ от таблицы comments к таблице users, нужно сделать следующее:
Страница на Github
Довольно интересный гем от ребят из thoughtbot. Суть его в том, что он анализирует модель, к которой вы его подключаете, и на основе этого анализа добавляет различные scope-методы.
Предположим, у вас есть модель Post, у которой есть поля в таблице: title, content, created_at, updated_at. И есть связь has_many :comments. Добавим Pacecar в нашу модель:
После этого нам станут доступны, например, такие скоупы:
Гем добавляет довольно много полезных методов, более подробно можно ознакомиться на Github.
Страница на Github
Существует довольно большое кол-во гемов, решающих проблему настроек в приложении. Cамой удачной, на мой взгляд, реализацией, является Settingslogic от небезызвестного Бена Джонсона. Простой, легковесный, использует YML-файл.
Автор гема предлагает использовать класс Settings и хранить его рядом с моделями (app/models/settings.rb).
Файл настройками в данном случае хранится в config/application.yml:
Настройки будут вызываться относительно текущего Rails-окружения. Обращаться к ним мы можем через класс Settings.
Страница на Github
Документация
Гем-заглушка за авторством Райна Бейтса, без которого я уже никак не могу обходиться. Смысл работы крайне прост — мы указываем в конфиге приложения (например, в config/enviroments/development.rb), что в качестве способа доставки почты хотим использовать letter_opener.
После этого вся исходящая почта начинает складываться в папке /tmp/letter_opener, а каждое письмо после сразу после отправки открывается в новой вкладке браузера. Просто и удобно.
Страница на Github
Гем от разработчиков Teambox, который позволяет вместо удаления записи помечать ее как 'deleted'. Бывает очень полезно, если мы хотим оградить неосторожного пользователя от потери данных.
Для использования гема нужно добавить поле deleted к таблице, записи которой хотим сделать «бессмертными»:
Затем подключить его в нужной модели:
Теперь каждая запись в модели Task вместо полного удаления из бд будет помечена как удаленная.
Страница на Github
На этом я заканчиваю эту заметку, надеюсь вы нашли в ней что-то полезное для себя.
За последние 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 << ActiveRecord::Base
include Pacecar
has_many :comments, :dependent => :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!
На этом я заканчиваю эту заметку, надеюсь вы нашли в ней что-то полезное для себя.