Оглавление
- Переход на 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 myapp
2.1 Включение гемов
Rails теперь использует
Gemfile
, чтобы знать какие плагины необходимы для запуска вашего приложения. Для чтения и работы с этим файлом существует новый гем bundler, который, помещает все нужные гемы в каталог vendor
, изолируя тем самым ваше приложение от системных гемов.Дополнительная информация — Using bundler.
2.2 Жизнь на грани
Теперь, благодаря
bundler
-у и Gemfile
-у, для того чтобы «заморозить» ваше приложение, достаточно выполнить специальную команду bundle
-ра — прощай rake freeze
!..Ну а если вы используете код из ветки master репозитория Rails, то для создания приложения просто передайте флаг
--dev
:$ rails myapp —edge
3. Архитектурные изменения в 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.rb
session_store
был перемещен вinitializers/session_store.rb
cookies.secure
теперь позволяет устанавливать зашифрованные значения в хеше cookie:cookie.secure[:key] => value
cookies.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 => true
ActiveRecord::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
используетсяformat
Active Resours'a. - Для блока схемы (schema block) используется
instance_eval
. - Исправлен
ActiveResource::ConnectionError#to_s
, где@response
не отвечал на #code или #message (...). - Добавлена поддержка для ошибок в формате JSON.
- Обеспечана работа
load
с массивами чисел. - Ответ 410 от удаленного источника, в случае если тот был удален, теперь распознается верно.
- В Active Resouce добавлена возможно установки опций SSL.
- Установка таймаута для соединения теперь также влияет на
Net::HTTP
open_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
теперь по умолчаниюtrue
ActiveSupport.escape_html_entities_in_json
теперь по умолчаниюtrue
Integer#multiple_of?
теперь принимает ноль в качестве аргумента, и если само число равно нулю — возвращаетfalse
string.chars
перемменован вstring.mb_chars
ActiveSupport::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
теперь работает со всеми множествами, даже если они не отвечают на:size
inspect
на нулевом промежутке времени вместо пустой строки теперь возвращает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_char
String#start_with?
иString#end_with?
(3rd person aliases still kept)String#bytesize
Object#tap
Symbol#to_proc
Object#instance_variable_defined?
Enumerable#none?
Следующие методы были удалены ввиду своей ненужности:
Object#remove_subclasses_of
,Object#subclasses_of
,Object#extend_with_included_modules_from
Object#extended_by
Class#subclasses
,Class#reachable?
,Class#remove_class
Regexp#number_of_captures
Regexp.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 за помощь в поиске ошибок!