rails

Хелпер для title

Типичная задача для нового сайта, расставить заголовки для страниц.

Если для тега указано значение, то выводим значение и название сайта. Если не указано, то только название сайта.

В application_helper.rb:

  def head_title
    if content_for(:title).present?
      "#{content_for :title} › #{Settings.main.title}"
    else
      Settings.main.title
    end
  end

В макет:

doctype
html
  head
    title= head_title

В представление:

- content_for :title, @post.title

Capistrano 3

Capistrano обновился до третьей версии, multistage из коробки и ощутимый прирост скорости.

exception_notification для мониторинга ошибок

Иногда ошибки возникают в production среде. Их не очень просто отловить даже если ошибка возникла из-за непосредственно ваших действий — нужно лезть в логи.

А если ошибка проявилась у пользователя, то вы вообще можете о ней никогда не узнать.

Чтобы быть в курсе дел можно использовать трекеры ошибок, например Airbrake и его opensource альтернативу Errbit.

Но в случае если приложение простое, например этот блог, можно ограничиться отправлением ошибок на почту при помощи exception_notification.

Вам автоматически будут приходить уведомления на почту, когда что-нибудь сломается:

Для четвёртых Рельс подключается так:

Gemfile #

gem 'exception_notification'

config/environments/production.rb #

В блок config добавить ваши настройки:

config.middleware.use ExceptionNotification::Rack,
    email: {
    email_prefix: "[dobroserver][error] ",
    sender_address: "server@domain.tld",
    exception_recipients: "admin@domain.tld",
    email_format: :html
  }

That's all folks!

Глобальные переменные в Rails

При разработке возникает вопрос хранения глобальных переменных:

И всё в том же духе.

Есть две причины вытащить все эти вещи в отдельный файл — удобство редактирования настрок и удобство исключения всего одного файла из репозитория (из соображений безопасности).

Параметры по умолчанию для rails new

Обычно я пишу примерно такую команду, чтобы создать приложение:

rails new solar_system --skip-test-unit --skip-bundle -d postgresql

Чтобы не указывать эти флаги каждый раз, можно создать .railsrc:

echo "--skip-bundle
--skip-test-unit
--database=postgresql" > ~/.railsrc

html2rss — flick

Очень простенькое веб-приложение, которое генерирует atom ленту о выходящих в московский прокат фильмах. Чтобы не пропустить возвращение The Big Lebowski, например.

http://flick.dobroserver.ru/

  1. С помощью nokogiri строим массив хешей с фильмами (при этом берём только фильмы с рейтином >= 7).
  2. Отправляем на покой полученные раньше фильмы (если фильма нет в последнем массиве, то кинотеатры он покинул).
  3. Создаём новые фильмы и выводим в atom ленту / index.

Всё это дело происходит в rake таске, который каждый час запускает whenever.

Можно использовать для получения rss из любого другого html.

Если мне понравится ходить по кинотеатрам — всё будет намертво закешировано и покрыто тестами. И возможно на более легковесном фреймворке.

Синхронизируем среду разработки с production

Во время разработки зачастую нужно синхронизировать локальную базу и файлы с production.

Для этого отлично годится Capistrano.

Закрываем сайт на время обслуживания

Периодически возникает потребность закрыть сайт на время обновления/обслуживания и выдавать пользователям какую-нибудь заглушку. Чтобы они не пугались.

Потребность в специальной maintenance.html имеется только для крупных проектов, поэтому для этого блога такой странички нет.

А для моего сервиса http://fitlog.ru она выглядит как-то так.

Эта статья о том как сделать подобную страничку используя nginx и capistrano.