Оглавление
- Переход на Rails 3.0
- Rails 3 требует Ruby 1.8.7+
- Объект Application в Rails
script/*заменен наscript/rails- Зависимости и
config.gem - Процесс перехода
- Создание приложения на Rails 3.0
- Включение гемов
- Жизнь на грани
- Архитектурные изменения
- Перезарядка Railties
- Все компоненты ядра Rails теперь независимы
- Абстракция Active Model
- Абстракция контроллеров
- Интеграция Arel
- Извлечение Mail
- Документация
- Интернационализация
- Railties
- Action Pack
- Абстрактный контроллер
- Action Controller
- Action Dispatch
- Action View
- Active Model
- Абстракция ORM и интерфейс c Action Pack
- Валидации
- Active Record
- Интерфейс запросов
- Усовершенствования
- Патчи и устаревшие методы
- Active Resourсe
- Active Support
- Action Mailers
- О создателях
Введение
Ruby on Rails 3.0 вышел! Он будет готовить за вас ужин и заполнять стиральную машинку бельем. Вы еще будете удивляться, как раньше без него жили. Это лучшие рельсы, которые мы когда-либо делали!
Ну а говоря серьезно, удалась действительно отличная вещь. С приходом создателей Merb в команду, мы реализовали их лучшие идеи, и, кроме того, сделали упор на агностицизм фреймворка, упрощение и ускорение кода, а также добавили горстку новых API. Если вы переходите на Rails 3.0 с Merb’a 1.x, скорее всего многое вам будет знакомо. И вы уж точно полюбите Rails 3.0, переходя с любой версии 2.х.
Но даже если вам нет дела до внутренней чистки кода, вы всё-равно неприменно почувствуете весь вкус Rails 3.0. Мы приготовили целый букет новых возможностей и обновленных API. Самое время становится разработчиком Rails. Вот основные из изменений:
- Совершенно новый роутер в RESTful-стиле;
- Новый API для Action Mailer, созданный по образу и подобию Action Controller (отныне без адской отправки сообщений из нескольких частей);
- Язык для создания цепочки запросов в Active Record, построеный на базе реляционной алгебры;
- Ненав��зчивые хелперы Javascript с драйверами для Prototype, jQuery и, в ближайшем будущем, других фреймворков (конец inline JS'у);
- Явное управление зависимостиями с Bundler-ом.
Данные заметки к релизу покрывают только основные нововведения, но отнють не каждый багфикс или мелкое изменение. Rails 3.0 состоит около 4,000 коммитов от более чем 1,600 авторов! Если вам необходимо узнать всё до мелочей, обратите внимание на список всех коммитов.
1. Переход на Rails 3
Как обычно, при переходе на новую версию лучше всего, чтобы ваш код был максимально покрыт тестами. И, для начала, вам лучше обновится до 2.3.5 чтобы убедиться, что ваше приложение исправно работает еще до перехода на Rails 3.0.
1.1 Rails 3.0 требует Ruby 1.8.7+
Rails 3.0 требует Ruby 1.8.7 или выше. Поддержка предыдущих версий официально прекращена, поэтому мы рекомендуем вам обновится до новой версии Ruby как можно скорее. Кроме того, Rails совместим с версией Ruby 1.9.2.
Имейте ввиду, что в Ruby 1.8.7 p248 и p249 присутствуют marshaling bugs, которые крашат Rails 3.0. В Ruby Enterprise Edition это исправлено начиная с версии 1.8.7-2010.02. Что касается 1.9, то Ruby 1.9.1 также нельзя использовать т.к. в Rails 3.0 он вызывает ошибки сегментации (segfaults). Таким образом, если вы хотите использовать Rails 3.0 ветке Ruby 1.9, прыгайте сразу на 1.9.2.
1.2 Объект Application
Как часть работы над поддержкой нескольких, запущенных в одном процессе, Rails-приложений, Rails 3.0 представляет новую концепцию, подразумевающую использование объекта
Application. Этот объект содержит все, специфичные для вашего приложения, настройки конфигурации и по своей природе он очень схож с содержимым config/environment.rb из предыдущих версий Rails.Теперь каждому Rails-приложению соответствует специальный объект
Application. Этот объект определен в файле config/application.rb. При необходимости обновить существующее приложение до новой версии Rails, нужно создать этот файл вручную, и скопировать в него нужную информацию из config/environment.rb.1.3 script/* заменен на script/rails
Новый script/rails теперь заменяет все скрипты в соответствующей папке. Но не нужно обращаться к script/rails напрямую — достаточно запустить команду
rails из корня приложения, которая, в контексте вашего приложения, выполнит указанный скрипт. Например:rails console # => ./script/console
rails g scaffold post title:string # => ./script/generate scaffold post title:string
Команда rails –help любезно предоставит весь перечен доступных опций.1.4 Зависимости и config.gem
Метод
config.gem ушел в небытие в пользу bundler’a и Gemfile’a (см. ниже «Включение гемов»)1.5 Процесс перехода
Для автоматизации и упрощения процесса перехода был создан специальный плагин — Rails Upgrade.
Просто установите плагин и запустите
$ rake rails:upgrade:check чтобы узнать, какие из существующих частей вашей программы нуждаются в ��бновлении (c сылками на информацию о том как и что обновлять). Также в плагине присутствует таск для генерации Gemfile, основанного на существующих вызовах в config.gem и таск для генерации нового файла с роутами на основе старого. Чтобы скачать плагин, просто выполните следующее — $ script/plugin install git://github.com/rails/rails_upgrade.git.Узнать на примере, как всё это работает, можно по ссылке Rails Upgrade is now an Official Plugin.
С другой стороны, если вам нужно больше помощи, всегда можно обратиться к людям на IRC канале или в рассылке rubyonrails-talk, которые, вероятно, занимаются тем же что и вы, и возможно даже сталкиваются с такими-же проблемами. Когда у вас наконец всё получиться — не забудте написать в своем блоге, чтобы поделится опытом с другими!
Дополнительная информация — The Path to Rails 3: Approaching the upgrade.
2. Создания нового Rails-приложенияя
Последовательность на данный момент выглядит вот так:
$ gem install rails --version 3.0.0
$ rails myapp
$ cd myapp2.1 Включение гемов
Rails теперь использует
Gemfile, чтобы знать какие плагины необходимы для запуска вашего приложения. Для чтения и работы с этим файлом существует новый гем bundler, который, помещает все нужные гемы в каталог vendor, изолируя тем самым ваше приложение от системных гемов.Дополнительная информация — Using bundler.
2.2 Жизнь на грани
Теперь, благодаря
bundler-у и Gemfile-у, для того чтобы «заморозить» ваше приложение, достаточно выполнить специальную команду bundle-ра — прощай rake freeze!..Ну а если вы используете код из ветки master репозитория Rails, то для создания приложения просто передайте флаг
--dev:$ rails myapp —edge3. Архитектурные изменения в Rails
Архитектура Rails претерпела 6 значительных зменений.
3.1 Перезарядка Railties
Railties были обновлены чтобы обеспечить надежный API для написания плагинов к любым компонентам фреймворка. Также были полностью переписаны генераторы и биндинги, что дает разработчикам возможность перейти на несравнимо иной уровень изящества их использования.
3.2 Все компоненты ядра Rails теперь независимы
Вместе со слияием Merb'a и Rails, одной из главных задач было избавиться от сильной связи между компонентами ядра Rails. Эта цель была достигнута, и теперь все ключевые компонены Rails используют единый API, который и вы можете использовать для разработки плагинов.
Это значит, что любой плагин или замена любого компонента ядра (использование, к примеру, DataMapper или Sequel) имеет доступ к той же функциональности, что и ядро, с возможностью ее расширения и улучшения.
Дополнительная информация — The Great Decoupling
3.3 Абстракция Active Model
Частью работы над отделением компонент было извлечение всех привязок к Active Record из Action Pack'a. Теперь когда это завершено, любому новому ORM плагину для правильной работы с Action Pack'ом достаточно реализовать все интерфейсы Active Model.
Дополнительная информация — ActiveModel: пусть любой Ruby объект почувствует себя ActiveRecord
3.4 Абстрактный контроллер
Друго значительной частью в работе над разделением компонетов в ядре стало создание базового суперкласса, изолированого от HTTP, для того, чтобы заниматся рендерингом шаблонов и пр. Создание Abstract Controller'a позволило значительно упросить Action Controller и Action Mailer путем извлечения общего для обоих кода в Abstract Controller.
Дополнительная информация — Rails Edge Architecture.
3.5 Интеграция Arel
Arel (или Active Relation) был взят в качестве фундамента для Active Record'а и отныне является одной из зависимостей Rails-приложения. Arel вносит особую абстракцию SQL, упрощая тем самым Active Record и предоставляя фундамент для реализации функционала отношений (relation) в Active Record.
Дополнительная информация — Why I wrote Arel.
3.6 Извлечение Mail
Action Mailer со дня своего создания постоянно обвешивался сомнительными заплатками, пре-парсерами и, в добавок к совмещению с TMail, обзавелся агентами для отправки и получения почты. В версии 3.0 весь функционал, относящийся к электронной почте был абстрактно вынесен в гем Mail. Это, опять-таки, уменьшило количество дублирующего кода и помогло отделить Action Mailer от парсера электронных писем.
Дополнительная информация — New Action Mailer API in Rails 3.
4. Документация
Документация ко всем изменениям в API находится в процессе обновления. В добавок к этому руководства Rails Edge также обновляются чтобы соответстовать всем изменениям в Rails 3.0. Тем не менее, руководства на guides.rubyonrails.org будут соответствовать лишь последне стабильной версии (т.е. версии 2.3.5, вплоть до окончательного релиза 3.0).
Дополнительная информация — Rails Documentation Projects.
5. Интернационализация
В Rails 3 значительный объем работы был проделан над поддержкой интернационализации. Последняя версия гема i18n включена и несет значительную оптимизацию скорости работы.
- I18n в каждый дом — теперь, по желанию, l18n можно внедрить в любой объект, добавив в него include модулей ActiveModel::Translation и ActiveModel::Validations. Кроме того добавлена поддержка перевода для errors.messages.
- У атрибутов теперь можно установить язык по умолчанию.
- Теги формы автоматически определяя статус объекта (Create или Update), подтягивают правильный язык перевода.
- Тег Label с l18n теперь работает правильно — достаточно передать ему имя атрибута.
6. Railties
Вместе с разделением главных компонентов внутри Rails, Railities были тщательно переработаны для того, чтобы облегчить взаимодействие между фреймворками, движками и плагинами, делая это максимально безболезненно и гибко:
- Каждому приложению отныне присваиватся свое собственное пространство имен (к примеру, запуск приложение выполняется так:
YourAppName.boot), что делает взаимодействие между приложениями значительно проще. - Теперь можно обратиться к
Rails.config, где доступно огромное множество настроек конфигурации вашего приложения. - Всё внутри
Rails.root/appтеперь автоматически добавляется кload path, поэтому теперь можно, скажем, добавить файлapp/observers/user_observer.rb, и Rails просто подгрузит его.
-dev, при установке приложения Gemfile берется из текущего репозитория Rails. См. rails –help для справки.Генераторам различных Railities было уделено огромное количество внимания. Вкратце:
- Генераторы были переписаны с нуля и более не являются обратно совместимыми.
- API шаблонов и генераторов были соединены воедино.
- Генераторы больше не загружаются из специального пути (load path), а просто подгружаются из пути загрузки (Ruby load path), поэтому вызов
script/generate fooсделает тоже, что иgenerators/foo_generator - Теперь к генератором можно легко подключить любой новый движок шаблонов, ORM или фреймворк для тестирования.
- В новых генераторах можно легко переписывать исходные шаблоны, просто положив нужный файл в
RAILS_ROOT/lib/templates. - Появился
Rails::Generators::TestCase, благодаря которому можно создавать и тестировать собственные генераторы.
- В генерируемых вьюшках теперь используются теги
divвместоp. - При генерации форм c помощью scaffold, вместо того чтобы дублировать код во вьюшках edit и new, теперь используется partial с припиской
_form - При генерации форм c помощью scaffold теперь используется
f.submit, который возвращает “Create ModelName” или “Update ModelName”, в зависимости от состояния в котором пришел объект
- Был добавлен таск
rake db:forward, благодаря которому теперь можно крутить миграции вперед индивидуально или в группах. - Был добавлен таск
rake routes CONTROLLER=x, что позволяет теперь просматривать роуты для одного конкретного контроллера.
RAILS_ROOTв пользуRails.root,RAILS_ENVв пользуRails.env,RAILS_DEFAULT_LOGGERв пользуRails.logger.
PLUGIN/rails/tasks и PLUGIN/tasks больше не загружаются — все задачи должны находится в каталоге PLUGIN/lib/tasks.Дополнительная информация:
7. Action Pack
Action Pack претерпел значительные внутренние и внешние изменения.
7.1 Abstract Controller
Из
Action Controller’a в Abstract Controller, в виде модулей, были вынесены основные части, которые теперь могут быть использованы при рендере шаблонов, partial’ов, helper'ов, интернационализации, логирова��ия и любой другой части цикла «запрос-ответ». Благодаря данной абстракции ActionMailer::Base теперь просто наследуется от Abstract Controller’a, являясь, всеголишь, оберткой над Rails DSL в виде гема Mail.Вынесение в
Abstract Controller всего, что только можно было, позволило значительно облегчить Action Controller. Тем не менее следует учитывать, что программисты не смогут напрямую обращаться к Abstract Controller’у, это не API.Дополнительная информация — Rails Edge Architecture.
7.2 Action Controller
- В
application_controller.rbотнынеprotect_from_forgeryустановлен по умолчанию. cookie_verifier_secretбыл признан устаревшим. Теперь вместо него следует обращаться кRails.application.config.cookie_secret, а его реализация теперь находится в отдельном файлеinitializers/cookie_verification_secret.rbsession_storeбыл перемещен вinitializers/session_store.rbcookies.secureтеперь позволяет устанавливать зашифрованные значения в хеше cookie:cookie.secure[:key] => valuecookies.permanentтеперь позволяет устанавливать постоянные значения в хеше cookie:cookie.permanent[:key] => value, которое вызывает исключение в случае, если верификация оказалась безуспешной- теперь можно передавать
notice => ‘Это flash-сообщение’или:alert => ‘Что-то пошло не так’для вызоваformatв блокеrespond_to. Хешflash[]по прежнему в строю respond_withбыл добавлен к контроллерам, упростив тем самым устаревшиеformatблоки- был добавлен
ActionController::Responder, при помощи которого можно гибко генерировать ответы (responses)
filter_parameter_loggingв пользуconfig.filter_parameters << :password
7.3 Action Dispatch
Введенный в Rails 3.0, этот новый компонент призван сильно упростить маршрутизацию.
- после сильной чистки и переписывания раутинга, отныне
router— этоrack_mountнад Rails DLS, т.е. по сути он теперь является отдельным небольшим приложением - роуты, объявленные в приложении теперь находятся в пространстве имен модуля Application. Т.е. теперь вместо:
Нужно писать:ActionController::Routing::Routes.draw do
map.resources :posts
end
AppName::Application.routes do
resources :posts
end - добавлен метод
match, так что теперь на подходящий (matched) роут можно навесить Rack-приложение - добавлен метод
constraints, давая возможность защищать свои роуты условиями - добавлен метод
scope, с помощью которого можно можно помещать роуты в пространства имен (к примеру, для различных языков или особых действией). Например, следующий код:
вызовет методscope ‘es’ do
resources :projects, :path_names => { :edit => ‘cambiar’ }, :as => ‘projeto’
endeditпо адресу/es/projeto/1/cambiar - добавлен метод
root, в виде ярлыка кmatch ‘/’, :to => path - в
matchможно передавать необязательный сегмент. Так, вmatch “/:controller(/:action(/:id))(.:format)”, любой заключенный в скобки текст является необязательный - роуты могут быть выражены в виде блоков, т.е. теперь к примеру можно писать
:home { match ‘/:action’ }
map по прежнему в строю, но с приходом 3.1 они исчезнут окончательно.Признаны устаревшими:
- принимающий всё на себя роут для не-REST приложений (
/:controller/:action/:id) был закоментирован :path_prefixдля роутов убран, а:name_prefixтеперь автоматически добавляет "_" в конце переданного значения
7.4 Action View
7.4.1 Ненавязчивый JavaScript
Значительной ревизии подверглись хелперы в Action View: были внедрены хуки для Unobtrusive JavaScript (UJS), а старые инлайн-AJAX команды канули в лету. Таким образом в Rails теперь можно использовать любой UJS драйвер для реализации UJS хуков в хелперах.
Это означает, что все существующие ранее хелперы
remote_ были удалены из рельсов, и теперь находятся в специальном хелпере Prototype Legacy Helper. Теперь, чтобы обратиться к UJS хукам, достаточно передать :remote => true. Так, к примеру:вернет:form_for @post, :remote => true
form action="http://host.com" id="create-post" method="post" data-remote="true"
7.4.2 Блочные хелперы
Такие хелперы как
form_for или div_for, которые вставляют контент из блока теперь используют <%=:<%= form_for @post do |f| %>
...
<% end %>
Ваши собственные хелперы такого типа вернут строку, а не допишут в буфер вывода «вручную».
Хелперы другого назначения, такие как
cache и content_for, остались нетронутыми.7.4.3 Другие изменения
- Больше не нужно вызывать
h(String)для фильтрации HTML — теперь все view генерируются с фильтрацией по умолчанию. Для того чтобы передать нефильтрованую строку, нужнно вызыватьraw(string). - Хелперы теперь возвращают разметку HTML5.
- Хелпер
labelтеперь достает данные из I18n одним параметром, т.е.f.label :nameсразу вернет переведенный:name. selectдля I18n теперь вызывается как:en.helpers.selectвместо:en.support.select.- Не нужно больше ставить знак минус в закрывающем теге ERb-шаблона для того, чтобы избежать перевода сроки.
- В ActionView добавлен хелпер
grouped_collection_select. - Добавлен метод
content_for?для проверки перед рендерингом, существует ли контент. - Передав
:value => nilдля хелперов формы вы тем самым установите значение поля вnilвместо использования стандартного значения. - Передав
:id => nilдля хелперов формы аттрибуетidне будет сгенерирован. - Передав
:alt => nilдля хелпера image_tag вы тем самым установите значение поля вnilвместо использования стандартного значения.
8 Active Model
Active Model — это новый компонент Rails 3.0. Теперь любая ORM библиотека может взаимодействовать с Rails — достаточно лишь воплотить интерфейс Active Model, который является лишь абстрактной прослойкой.
8.1 Абстракция ORM �� интерфейс Action Pack'a
Частью работы по разъеденению основных компонентов Rails ствло извлечение всех связей в Active Record из Action Pack'a. Теперь, когда это завершено, любой ORM библиотеке достаточно лишь реализовать интерфейсы Active Model, чтобы просто обращаться к Active Record.
Дополнительная информация — Make Any Ruby Object Feel Like ActiveRecord
Валидации 8.2
Валидации перекочевали из Active Record в Active Model, предоставив тем самым свой интерфейс для других ORM библиотек.
Теперь существует метод
validates :attribute, options_hash. В
options_hash можно передавать сразу несколько различных валидаций, среди которых::acceptance => Boolean:confirmation => Boolean:exclusion => { :in => Ennumerable }:inclusion => { :in => Ennumerable }:format => { :with => Regexp, :on => :create }:length => { :maximum => Fixnum }:numericality => Boolean:presence => Boolean:uniqueness => Boolean
Также можно передать объект-валидатор, который можно использовать в разных объектах типа ActiveModel. Например:
Или для объектов типа Active Record:class TitleValidator < ActiveModel::EachValidator
Titles = [‘Mr.’, ‘Mrs.’, ‘Dr.’]
def validate_each(record, attribute, value)
unless Titles.include?(value)
record.errors[attribute] << ‘must be a valid title’
end
end
end
class Person
include ActiveModel::Validations
attr_accessor :title
validates :title, :presence => true, :title => true
end
class Person < ActiveRecord::Base
validates :title, :presence => true, :title => true
end
Дополнительная информация:
9. Active Record
Для Active Record в Rails 3 было уделено множество внимания: абстракция в Active Model, полностью обновленный интерфейс запросов с использованием Arel, обновления в валидациях и множество других изменений. Все устаревшие API из Rails 2.x будут работать как и раньше, но с выходом Rails 3.1 с ними придется попрощаться.
9.1 Интерфейс запросов
Любой метод в Active Record, благодаря использованию Arel, теперь возвращает
relation. Существующий API будет признан устаревшим в Rails 3.1, и полностью удален из фреймворка в версии Rails 3.2. Среди новых методов, которые можно выстраивать в цепочки, присутствуют следующие:where— предоставляет условие для reletion, т.е. что будет выбрано.select— выбор нужного аттрибута из БД.group— группирует relation на предоставленном аттрибуте.having— аналогGROUP BYиз SQL.joins— выполняет объеденение relation'a с другой таблицей.clause— аналогJOINиз SQL.includes— включает другие, созданные ранее ralations.order— упорядочивает relation согласно переданному выражению.limit— устанавливает предел количества записей в relation.lock— блокирует пришедшие из БД записи.readonly— возвращает копию данных в режиме доступа «только для чтения».from— дает возможнос��ь для relation'a делать выборку из нескольких таблиц.scope— (ранееnamed_scope) вовзращает объект relation.with_scope— как иwith_exclusive_scope, также возвращает объект relation.default_scope— также работает с relation'ами
9.2 Прочие улучшения
- добавлен
:destroyed?к объектам Active Record - добавлен
:inverse_ofдля отношений, позволяя получить уже загрузившееся отношение без обращения к БД
9.3 Патчи и прекращения поддержки
В добавок ко всему, в ветке Active Record произошло множество других изменений:
- Поддержка SQLite 2 прекращена в пользу SQLite 3.
- Реализована поддержка для порядка колонок в MySQL.
- В адаптере для PostgreSQL исправлена
TIME_ZONE— больше никаких ошибочных значений. - Поддержка нескольких схем для таблиц в PostgreSQL.
table_nameтеперь кешируется.- Проведена сильная чистка, на ряду с множественными багфиксами адаптера для БД Oracle.
named_scopeв Active Record признан устаревшим и переименован вscope- в методе
scopeнужно использовать методы relation'ов вместо поиска в стиле:condition => {}. Например::since, lambda {|time| where(“created_at > ?”, time) } save(false)признан устаревшим в пользуsave(:validate => false)- сообщения I18n об ошибке для Active Record необходимо изменить с
:en.activerecord.errors.templateна:en.errors.template model.errors.onпризнан устаревшим в пользуmodel.errors[]validates_presence_ofтеперь стал:presence => trueActiveRecord::Base.colorize_loggingиconfig.active_record.colorize_loggingпризнаны устаревшими в пользуRails::Subscriber.colorize_loggingилиconfig.colorize_logging.
10. Active Resourse
Active Resourse также был извлечен в Active Model, что позволило легко использовать объекты Active Resourse в Action Pack.
- Добавлены валидации благодаря Active Model.
- Добавлены observing hooks.
- Поддержка HTTP proxy
- Добавлена поддежка для digest-аутентификации.
- Присвоение имен моделям перемещено в Active Model.
- Аттрибуты Active Resource изменены на хеш с произвольным доступом.
- Добавлены alias-методы
first,lastиallдля соответствующих scope. find_everyбольше не возвращает ошибкуResourceNotFound, если ничего не найдено- Добавлен
save!, который возвращаетResourceInvalidв случае, если объект неvalid?. - В модели ActiveResource добавлены методы
update_attributeиupdate_attributes. - Теперь, для загрзки удаленных ошибок, вместо их
content-typeиспользуетсяformatActive Resours'a. - Для блока схемы (schema block) используется
instance_eval. - Исправлен
ActiveResource::ConnectionError#to_s, где@responseне отвечал на #code или #message (...). - Добавлена поддержка для ошибок в формате JSON.
- Обеспечана работа
loadс массивами чисел. - Ответ 410 от удаленного источника, в случае если тот был удален, теперь распознается верно.
- В Active Resouce добавлена возможно установки опций SSL.
- Установка таймаута для соединения теперь также влияет на
Net::HTTPopen_timeout.
save(false)признан устаревшим в пользуsave(:validate => false)- Ruby 1.9.2:
URI.parseи.decodeпризнаны устаревшими и больше не используются в библиотеке
11. Active Support
Мы достигли большого успеха в работе над Active Support, так что теперь вам не прийдется включать всю библиотеку Active Support только для того, чтобы использовать какое-то небольшое подмножество её функций. Таким образом, множество внутренних модулей Rails начали работать гораздо шустрее.
- проведена тотальная чистка всей библиотеки, также было убрано множество неиспользуемых методов
- Active Support больше не предоставляет методы от TZInfo, Memchache Client и Bundle: теперь всё это нужно инклудить отдельно, предварительно установив командой
gem bundle - добавлен ActiveSupport::SafeBuffer
- исправлены
Array.uniq_byиArray.uniq_by! - исправлена ошибка, при которой
TimeZone.seconds_to_utc_offsetвозвращал неверное значение - добавлена прослойка
ActiveSupport::Notifications ActiveSupport.use_standard_json_time_formatтеперь по умолчаниюtrueActiveSupport.escape_html_entities_in_jsonтеперь по умолчаниюtrueInteger#multiple_of?теперь принимает ноль в качестве аргумента, и если само число равно нулю — возвращаетfalsestring.charsперемменован вstring.mb_charsActiveSupport::OrderedHashтеперь может быть де-сериализован через YAML- добавлен парсер на основе SAX для XmlMini, с использованием LibXML и Nokogiri
- добавлен метод
Object#presence, который возвращает объект если он присутствует (иначе —nil) - добавлен метод
String#exclude?который возвращается отрицаниеinclude? - добавлен метод
to_iвDateTime, вActive Support, так что теперьto_yamlработает верно на моделях с атрибутомDateTime - добавлен метод
Enumerable#exclude?чтобы составить компаниюEnumerable#include?, избежав тем самым конструкций вида!x.include? - XSS фильтрация теперь включена по умолчанию
- добавлена поддержка глубокого слияния в
ActiveSupport::HashWithIndifferentAccess Enumerable#sumтеперь работает со всеми множествами, даже если они не отвечают на:sizeinspectна нулевом промежутке времени вместо пустой строки теперь возвращает0- в
modelnameдобавленыelementиcollection String#to_timeиString#to_datetimeдопускают дробные секунды- добавлена поддержка новых колбеков для объекта-фильтра, отвечающего на
:beforeи:after, используемые до и после колбеков - метод
ActiveSupport::OrderedHash#to_aвозвращает упорядоченное множество массивов (совпадает сHash#to_aиз Ruby 1.9) MissingSourseFileприсутствует в виде константы, но её значение всегда равноLoadError- добавлен
Class#class_attribute, благодаря которому можно объявить атрибут уровня класса, чье значение может быть наследовано и переписано дочерними классами - наконец-то из
ActiveRecordудаленыDeprecatedCallbacks
Integer#even?andInteger#odd?String#each_charString#start_with?иString#end_with?(3rd person aliases still kept)String#bytesizeObject#tapSymbol#to_procObject#instance_variable_defined?Enumerable#none?
Следующие методы были удалены ввиду своей ненужности:
Object#remove_subclasses_of,Object#subclasses_of,Object#extend_with_included_modules_fromObject#extended_byClass#subclasses,Class#reachable?,Class#remove_classRegexp#number_of_capturesRegexp.unoptionalize,Regexp.optionalize,Regexp#number_of_captures
12. Action Mailer
С заменой TMail на новый Mail, Action Mailer получил полностью новый API. Сам по себе, Action Mailer был практически полностью переписан. В результате проделанной работы, теперь Action Mailer просто наследуется от Abstract Controller'a, и теперь обертывает Mail gem. Это позволило сократить количество кода и дублирующих библиотек внутри Action Mailer.
- все отправители теперь по умолчанию находятся в папке
app/mailers - теперь можно отсылать email, используя новый API с трёмя методами:
attachments,headersиmail - все методы Action Mailer, связаные с почтой теперь возвращают объект Mail::Message, который далее может быть отправлен собственным методом
deliver - метод доставки почты теперь может принимать хеш со всеми нужными заголовками письма
- метод доставки почты теперь работает также как и
respond_blockв Action Contoller'e, так что теперь можно явно или неявно рендерить шаблоны письма. Кроме того, Action Mailer теперь разделит письмо на несколько частей, если нужно - можно передать proc в вызов
format.mime_typeвнутри mail-блока, тем самым явно делая рендер резличных типов текста, или добавляя новые шаблоны или лейауты - все unit-тесты mailer'а теперь стали функциональными тестами
:charset,:content_type,:mime_version,:implicit_parts_orderпризнаны устаревшими в пользу соответствующих вызовов в стилеActionMailer.default :key => value- Динамические методы
create_method_nameиdeliver_method_nameотныне признаны устаревшими — просто вызывайтеmethod_name, который возвращает объектMail::Message. ActionMailer.deliver(message)устарел, достаточно вызватьmessage.deliver.template_rootустарел — передавайте опции в вызов рендера внутри Proc-объекта из методаformat.mime_typeвнутри блока генерацииmail.- Метод
body, для определения instance-переменных теперь также устарел (body {:ivar => value}), так что теперь достаточно обьявлять instance-переменные непосредственно внутри метода — они будут видны во вьюшке. - Мейлеры теперь перемещены из каталога
app/modelsвapp/mailer.
13. Участники
Обратите внимание на полный список участников, которые провели множество часов внося свой вклад в Rails 3. Честь и хвалам им всем!
PS. Правка форматирования, а также исправление ошибок и неточностей перевода находится в процессе.
PPS. Спасибо maratk за помощь в поиске ошибок!