ruby

Быстрая навигация по исходникам гемов с Vim

Наиболее IDE-шная особенность Vim из мне известных — поддержка тегов. С ними смотреть исходники гемов гораздо удобнее чем с bundle open или show-source.

Нажав Ctrl+] переходим на класс / метод под курсором. Нажав Ctrl+t возвращаемся обратно.

Полезно для классов большого проекта и самое главное — его гемов. Можно из своего контроллера перейти на ActionController::Base, а оттуда закопаться ещё дальше в Рельсы открыв ActiveSupport::Autoload. И снова вернуться обратно в свой проект нажав Ctrl+t два раза.

Хелпер для 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.

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

Метки для Ruby кода

Для Руби кода можно использовать специальные комментарии:

# TODO add named_scopes
# FIXME method A is broken
# OPTIMIZE improve the code

И просматривать их с помощью rake notes:

app/controllers/application_controller.rb:
  * [ 6] [TODO] Продумать авторизацию

app/models/comment.rb:
  * [ 8] [TODO] exclusion registered users nicks

app/models/message.rb:
  * [ 8] [TODO] antispam

app/models/tag.rb:
  * [27] [FIXME] игнорировать не уникальные slug

app/views/posts/show.html.slim:
  * [14] [OPTIMIZE] переписать этот ужас

app/views/shared/_sidebar.html.slim:
  * [25] [TODO] icon.png

При этом можно смотреть метки только одного типа:

rake notes:todo
rake notes:fixme
rake notes:optimize

Или даже свои собственные:

rake notes:custom ANNOTATION=MYANNO

И ещё один плюс меток в том, что они обычно подсвечиваются в текстовых редакторах.