29 Дек

Настройка автоматического запуска puma при перезагрузке сервера

Для своих Rails-приложений я в последнее время использую связку puma+nginx. И достаточно продолжительное время я ленился настроить функционал автоматического старта приложений при ребуте сервера. Ну, типа, раз в месяц если он перезапустится, то и фиг с ним, вручную стартану. Благо, что особо критичных к простою проектов у меня нет (на самом деле есть, но там очень быстро мне сообщают о проблеме и я её очень быстро решал). Но надо что-то менять и я решил, что пришло то самое время.

Читать далее
13 Мар

Настройка подключений к нескольким базам данных в Rails.

Решил сделать перевод на русский язык статьи Setting up multiple databases in Rails: the definitive guide

(By Roberto Ostinelli / December 2, 2015).

Переводчик я непрофессиональный, поэтому в некоторых местах буду позволять себе вольности, но общий смысл будет сохранен.

Статья написана для Rails 4, но работает и в Rails 5 тоже, по крайней мере, на момент перевода статьи. 

———————

Может быть множество разных причин, зачем вам может понадобиться подключение к нескольким базам данных в вашем Ruby in Rails приложении. В моём случае необходимо было хранить большое количество данных, отражающих поведение пользователя: клики, посещаемые страницы, изменения истории и т. д.

Такие типы баз данных обычно не критичны для основной цели, а разрастаются намного быстрее (и до гораздо бОльших размеров), чем другие БД.

Требования к ним достаточно разнообразны: к примеру, они требуют больше пространства, более терпимы к аппаратным и программным сбоям, а также у них в приоритете идёт запись в базу, а не чтение. По этим причинам иногда выгодно отделить такие БД от основной базы вашего приложения. Зачастую для таких задач используются нереляционные СУБД, что уже выходит за пределы темы, по которой писалась данная статья.

Я нашел и прочитал множество различных решений, но я так и не смог найти такого, которое бы полностью выполняло следующие условия:

  • Должны быть различные и изолированные друг от друга миграции и схемы для каждой базы данных
  • Должны использоваться генераторы Rails для создания новых миграций для каждой БД, независимо друг от друга
  • Должны присутствовать специфические для баз данных задания rake для основных операций над БД (например такие же, как и для основной БД)
  • Должна быть интеграция с заданиями spec RSpec’а.
  • Должно работать с Database Cleaner
  • Должно работать на Heroku

Это мой взгляд на то, как удовлетворить все вышеуказанные требования и получить полностью рабочее Rails-приложение с подключением к нескольким БД.

Читать далее

08 Авг

Ошибка при установке Passenger

Каждый раз сталкиваюсь с этой проблемой и каждый раз забываю, в чём причина.
После установки Passenger и попытке запуска passenger-install-apache2-module выскакивает примерно следующая ошибка:
`method_missing': undefined method `this' for #<Gem::Specification:0x4db6d12 … бла-бла-бла
Код ошибки может отличаться и ситуация может быть другой.
Решение следующее:
достаточно выполнить следующую команду
gem update --system 2.4.8 --no-ri --no-rdoc

Этой командой мы апдейтим апдейтер до нужной нам версии.
Такие дела.

15 Янв

Проблема с bootstrap в продакшене RoR

После установки на рельсы bootstrap из вот этого репозитория столкнулся с проблемой, что не подгружаются ассеты при развертывании приложения в продакшен. То есть css и js просто не подгружаются. Совсем.
Версия руби: ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]

Версия рельс: Rails 4.2.5

В итоге наткнулся на stackoverflow на тему с такой же проблемой, где советуют сделать прописать следующие параметры в файле %rails_app%/config/environments/production.rb

config.assets.compile = true
config.assets.precompile = ['*.js', '*.css', '*.css.erb']

Ну я и прописал. Но, как обычно, ничего никогда не проходит гладко. Поэтому после этого у меня выскочила ошибка:
Undefined variable: "$alert-padding".
Немного погуглив, нашел решение, что строку

config.assets.precompile = ['*.js', '*.css', '*.css.erb']

всё же лучше убрать, оставив только

config.assets.compile = true

Ну и после этого всё нормально заработало (пока что). Впрочем, сейчас всё равно пока переключусь на development.