Pull to refresh

Rails 3.1: Release Candidate

Reading time4 min
Views667
Original author: David Heinemeier Hansson
Сегодня вышел первый релиз-кандидат RoR 3.1, к чему в оффициальном блоге написали обзорную статью о ключевых нововведениях в предстоящей версии. Чтобы познакомить вас с нововведениями, перевожу с пояснительными комментариями для тех, кто ничего об этом не слышал. Далее в тексте курсивом мои примечания.


Как я (DHH — прим. переводчика) и обещал на RailsConf, мы наконец готовы выпустить Rails 3.1: Release Candidate. Это фантастически захватывающий релиз. В нём появилось две новых киллер-фичи и намного больше просто потрясающих улучшений. Для начала киллер-фичи:

Asset Pipeline

Ключевой фичей в 3.1 станет asset pipeline под управлением Sprockets 2.0. Оно позволяет намного органичнее организовывать CSS и JavaScript, в том числе в плагинах и движках (Engines). Подробное описание можно послушать на моём выступлении на RailsConf. По умолчанию asset pipelines идёт с SCSS для таблиц стилей и CoffeeScript для JavaScript. Большое количество документации на подходе.
Asset Pipeline — это общее обозначение новой концепции работы с клиентской частью приложения. Общий смысл его в том, что теперь как генерируются контроллеры, виды и модели для ваших скаффолдов, также будут создаваться и JS и CSS. Это позволяет достичь более удобной архитектуры и разгрести десятки десятки файлов из public/javascript по модулям. Рельсы сами будут заботиться о сборке всех ваших клиентских файлов в один и кешировании.

HTTP-Стриминг

Это нововведение позволит начать браузеру скачивать таблицы стилей и javascript'ы ещё до того, как браузер закончит формировать ответ. Результат — заметное увеличение скорости отдачи страниц. Это всего лишь опция, которая требует поддержки от web-сервера, но популярное сочетание nginx+unicorn уже готово это обеспечивать. На RailsCasts есть видео об этом, также можно посмотреть документацию здесь.

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

jQuery теперь по дефолту

Мы сделали jQuery дефолтным JavaScript-фреймворком, который поставляется с Rails, но откатиться на Prototype остаётся всё так же легко. Они устанавливаются с помощью Bundler'а в гемах jquery-rails и prototype-rails. Просто выберите нужный в Gemfile и оно Просто Заработает.

Другие вкусности:

  • Самообратимые миграции (Reversible migrations): DRY миграции, которые знают сами, как себя обратить. Чище, симпатичнее, проще. Да, больше не надо self.up и self.down, всё стало ещё более декларативным.
  • Монтируемые движки (Mountable engines): Движки теперь могут быть иметь своё собственное пространство роутов и хелперов (также как и новые assets, документация скоро появится). Здесь можно почитать их предысторию (правда про assets там уже устарело).
  • Карта сущностей (Identity map): Не включена по дефолту из-за важных моментов, которые до сих пор надо подчистить. Однако если вы можете с ними смириться, то это будет прекрасный способ уменьшить количество вызываемых запросов. Быстрее значит лучше! Раньше, когда вы делали два одинаковых запроса в action'е, то второй запрос брался из кеша, однако объекты создавались заново. Теперь с картой сущностей одна запись в БД = один объект в front-end'е. Кроме того, что помогает избежать лишних запросов, ещё и упрощает отладку (изменения, сделанные в запись в одном месте, но ещё не сохранённые, влияют теперь на весь ответ).
  • Подготовка выражений (Prepared statements): ActiveRecord теперь использует кешированные подготовленные выражения, которые дают большой прирост производительности в PostreSQL и на сложных запросах в MySQL. Вместо формирования запроса и передачи его в БД каждый раз, Rails один раз формирует запрос, а затем использует его специальный токен (подставляя нужные данные), когда нужно сделать похожий. Даёт прирост в производительности на 20-30% на простых запросах и 10-кратный (!) прирост по запросам в секунду на сложных запросах.
  • Rack::Cache включен по дефолту: Делает возможным использование HTTP-кеширования с условным получением (Conditional Get) как замены для постраничного кеширования (которое мы скоро оформим как плагин и уберём из поставки). Rack::Cache — это движок, использующий заголовки HTTP (Expires, Cache-Control, Last-Modified, ETag) для оформления кеша. Условное получение — получив запись и проверив, что последнее время доступа позже, чем время изменения, отдаём 304. Заменит постраничное кеширование, которое практически нерентабельно, если у вас есть небольшие всегда динамические куски страницы (к примеру, панель текущего пользователя при отображении почти статичных данных).
  • Turn — новый вывод для Test::Unit в Ruby 1.9: Намного симпатичнее и понятнее отображение при прохождении тестов. Доступно для новых приложений на Ruby 1.9.
  • ForceSSL: Теперь поддерживать безопасность приложений проще, чем никогда. Доступно по-приложениям и по-контроллерно. Одна строчка в конфиге — и указанные роуты с http будут перенаправляться на https.
  • Основанный на ролях mass-assignment: attr_protected теперь принимает в качестве параметра роль, так что с разделением админ/не-админ и т.п. теперь работать намного проще. Похоже, в 3.1 можно будет забыть о CanCan. Вещь очень интересная, советую посмотреть о ней в RailsCasts по ссылке ниже.
  • has_secure_password: простое встраивание парольной защиты на BCrypt. Теперь нет прощения тем, кто не поднимет сам свою собственную схему аутентификации. Вообще говоря, ничего кроме пароля оно не даёт. Тем, кому нужно восстановление паролей, блокировка, подтверждение регистрации и т.п., всё равно придётся использовать Devise (который Rack-based, и от нововведения профита не получит).
  • Настраиваемая сериализация (Custom serializers): Сериализация объектов в JSON, или во что угодно, что вам нравится. Если раньше serialize клал в базу YAML, то теперь можно самому, задав методы load и dump, выбрать способ хранения объектов.


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

Если вы создаёте новое приложение, то лучше используйте Ruby 1.9.2. Rails будут поддерживать 1.8.x вплоть до 4.0, но только для совместимости. Ruby 1.9.x — вот тренд. Присоединяйтесь и наслаждайтесь внезапным взрывом скорости.

Установить Rails 3.1 RC вы как всегда можете с помощью gem install rails --pre. Наслаждайтесь релизом и отправляйте баги на github. Финальная версия ожидается через пару недель, если всё пойдёт как по маслу.
Tags:
Hubs:
Total votes 61: ↑55 and ↓6+49
Comments104

Articles