Структура клиентского кода в Rails приложениях

У меня есть идея о том как распределять js/coffee файлы в Rails приложениях, тех что не SPA. Правда пока не пробовал его в бою) но тем не менее мне, он кажется перспективным.

Основной посыл в том чтобы браузер загружал и использовал только те скрипты, которые используются в рамках одного action. Точнее даже так один action — один js файл.
Читать далее «Структура клиентского кода в Rails приложениях»

Алгоритм действий, гем Workflow

Гем Workflow (Процесс) добавляет в объект способность хранить очерёдность состояний и возможных действий.

Процесс имеет разные состояния (State). В единицу времени только одно состояние может быть активно. Состояния могут переходить (Transition) от одного к другому. Чтобы совершить переход, должно произойти какое-то событие (Event). При активации события, можно исполнить произволное дополнительное действие (Action). Другими словами каждое состояние содержит произволное количество событий, запуск события ведёт к другому состоянию, и возможному запуску какого-то действия связанного с этим событием. Кроме того можно отследить вход и выход из состояния, поймать ошибку при переходе.

Читать далее «Алгоритм действий, гем Workflow»

Использование FriendlyID и Rails 5

Простая инструкция для внедрения ЧПУ или любого рода слагов в проект на Ruby on Rails.

В примере будут использованы гемы FriendlyID и Babosa (для поддержки кириллицы).
Читать далее «Использование FriendlyID и Rails 5»

Декораторы в rails

Продолжая топик о презентерах.

У постов есть статус, в простом варианте true\false, если в шаблоне выводить просто @post.status, то ничего хорошего из этого не выйдет. Хочется например как-то так:

Логичное продолжение — перенос этой логики в helper.

Основным недостатком хелперов является “загрязнение” глобальной области видимости. Кстати, в данном конкретном случае с post, такой вариант возможно и выгоден, если все модели содержат поле статус, и должны выводить подобное сообщение.

Но с декораторами можно перенести логику шаблона в отдельный модуль (инкапсулировать). Rails по умолчанию не создаёт папки decorators, надо это сделать в папке app. А в папке decorators файл post_decorator.rb

Декоратор должен содержать конструктор в который передаётся объект который надо декорировать.
Читать далее «Декораторы в rails»

Презентер в rails

По мотивам Ruby on Rails — Presenters & decorators

Презентер

С прогрессом проекта шаблоны становятся сложнее, там появляется нетривиальная логика. И конечно же контроллеры тоже разрастаются. Существует такой паттерн проектирования приложений — presenter (презентер). Это модуль который знает о модели и шаблоне.

Пример простого контроллера и шаблона, до внедрения презентера.

Контроллер

Модель

Шаблон

Внедрение презентера простое в папку App — добавьте папку presenters/post , файл index_presenter.rb

Содержимое презентера предельно простое:

Обновлённый контроллер

Обновлённый шаблон

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

rubynotes

База

  • Базовые типы данных в ruby: Fixnum, Bignum, Float, Array, String, Hash.
  • В руби всё объекты, например число 1 — это объект класса Fixnum (проверка 1.class).
  • Каждый объект имеет уникальный object_id, например 1.object_id.
  • Каждый класс имеет набор методов, например 1.to_f. Существуют методы классы и методы объекта.
  • Применяя * к строке, например «John» * 5 , вы на строке «John» используете метод *, с аргументом 5. Иначе говоря «John» * 5 == «John».*(5)
  • Если вызвать у объекта несуществующий метод, то получим ошибку #, а вот у строки такой метод есть 40.to_s.reverse
  • Скобки при вызове метода необязательны.
  • Метод gsub проходит по всей строке и заменяет одну подстроку, на другую — ‘I\’m a senior developer’.gsub(‘senior’, ‘junior’).
  • Есть ряд методов которые вызываются без объекта, например puts, но объект просто опущен, так как используется корневой объект Kernel.
  • Методы с ! на конце меняют оргинальный объект, а методы с ? на конце — это так называемые предикаты, которые по соглашению возвращают булевое значение.
  • Хэши posts = {:title => ‘Заголовок’, ‘content’ => ‘Содержание статьи’ } эквивалент posts = {title: ‘Заголовок’, ‘content’ => ‘Содержание статьи’}. Краткая запись title: ‘Заголовок’, доступна только тогда когда ключом является символ , доступ к элементам хэша

Читать далее «rubynotes»

Docker геттинг стартед

Немного Docker в вашу копилку. На работе и в быту начал немного применять этот инструмент, и хочется в записках разобраться.

Установка довольно проста, только как оказалось 32-х разрядные системы не поддерживаются. Для Mac или Windows необходимо просто скачать и установить Docker Toolbox. После установки проверьте в консоли

Читать далее «Docker геттинг стартед»

Links to like

LinksToLike — это один из проектов над которыми я недавно работал. В качестве хобби-проектов или коммерческих, но не попадающих в мой основной профессиональный профиль. О паре проектов я хочу рассказать.
Читать далее «Links to like»

SSRS — Stupid simple rails server

В этом рассказе я собираюсь записать себе на память (а может и кому-то пригодится) процесс установки и деплоя rails приложения на сервер. Или даже не так, рассказ о том как настроить сервер за 10 минут пренебрегая всеми правилами безопасности. На самом деле если хочется быстрее сервер и меньше возни, то удобнее конечно взять Heroku. Или говорят Docker тоже в этом плане удобен. Так что будем считать что этот текст вот совсем для новичков.

В качестве сервера Debian 8 64 bit, приложение на Rails 5 и база данных конечно Postgres.
Читать далее «SSRS — Stupid simple rails server»

Javascript роутер в 90 строк

Перевод статьи A modern JavaScript router in 100 lines

Требования:
Роутер должен:

  1. содержать меньше 100 строк
  2. поддерживать url с хэшами
  3. работать с History API
  4. предоставлять простой API интерфейс
  5. запускаться вручную
  6. отрабатывать только в тех случаях когда это необходимо

Читать далее «Javascript роутер в 90 строк»