Ключевые новинки в Rails 4.0:
Эти заметки о релизе покрывают только основные изменения. Чтобы узнать о различных исправлениях программных ошибок и изменениях, обратитесь к логам изменений или к списку коммитов в главном репозитории Rails на GitHub.
Прежде чем апгрейднуть существующее приложение, было бы хорошо иметь перед этим покрытие тестами. Также, до попытки обновиться до Rails 4.0, необходимо сначала произвести апгрейд до Rails 3.2 и убедиться, что приложение все еще выполняется так, как нужно. Список вещей, которые нужно выполнить для апгрейда доступен в руководстве Апгрейд Ruby on Rails
# Необходим установленный RubyGem 'rails'
$ rails new myapp
$ cd myapp
Сейчас Rails использует Gemfile
в корне приложения, чтобы определить гемы, требуемые для запуска вашего приложения. Этот Gemfile
обрабатывается гемом Bundler, который затем устанавливает все зависимости. Он может даже установить все зависимости локально в ваше приложение, и оно не будет зависеть от системных гемов.
Подробнее: - домашняя страница Bundler
Bundler
и Gemfile
замораживает ваше приложение Rails с помощью новой отдельной команды bundle
. Если хотите установить напрямую из репозитория Git, передайте флажок --edge
:
$ rails new myapp --edge
Если имеется локальная копия репозитория Rails, и необходимо сгенерировать приложение используя ее, передайте флажок --dev
:
$ ruby /path/to/rails/railties/bin/rails new myapp --dev
Gemfile
.
params.permit(:title, :text)
).
comments
из /posts/1/comments
and /videos/1/comments
).
response.stream
.
ActiveModel::Model
- это миксин, чтобы обычные объекты Ruby могли работать с ActionPack "из коробки" (например, form_for
).
Убедитесь, что используемые вами гемы тредобезопасны.
raw
, или вызван html_safe
.
X-Frame-Options
(предотвращает кликджекинг, запрещая браузеру встраивать страницу в фрейм), X-XSS-Protection
(говорит браузеру прерывать инъекцию скрипта) и X-Content-Type-Options
(предотвращает открытие браузером jpeg как exe).
В Rails 4.0 некоторые особенности были извлечены в гемы. Можно просто добавить извлеченный гем в свой Gemfile
, чтобы вернуть функциональность.
Руководства были переписаны на GitHub Flavored Markdown.
Руководства имеют адаптивный дизайн.
Обратитесь к Changelog за полными изменениями.
Новые места расположения для тестов test/models
, test/helpers
, test/controllers
и test/mailers
. Также добавлены соответствующие задачи rake. (Pull Request)
Исполняемые файлы приложения теперь находятся в директории bin/
. Запустите rake rails:update:bin
чтобы получить bin/bundle
, bin/rails
и bin/rake
.
Тредобезопасность включена по умолчанию
Была убрана возможность использования произвольного билдера, передав --builder
(или -b
) в rails new
. Вместо нее рассмотрите шаблоны приложения. (Pull Request)
config.threadsafe!
устарело в пользу config.eager_load
, которая предоставляет более тонкую настройку того, что будет лениво загружаться.
Rails::Plugin
больше нет. Вместо добавления плагинов в vendor/plugins
, используйте гемы, или bundler с путем, или зависимости git.
Обратитесь к Changelog за полными изменениями.
Обратитесь к Changelog за полными изменениями.
Добавлен ActiveModel::ForbiddenAttributesProtection
, простой модуль для защиты атрибутов от массового назначения, когда передаются неразрешенные атрибуты.
Добавлен ActiveModel::Model
, примесь, чтобы объекты Ruby могли работать с Action Pack "из коробки".
Обратитесь к Changelog за полными изменениями.
Заменен устаревший гем memcache-client
на dalli
в ActiveSupport::Cache::MemCacheStore
.
Оптимизирован ActiveSupport::Cache::Entry
для уменьшения расхода памяти и процессора.
Словоизменения теперь могут быть определены для локали. singularize
и pluralize
принимают локаль как дополнительный аргумент.
Object#try
теперь будет возвращать nil вместо вызова NoMethodError, если вызывающий объект не реализует этот метод, но все еще можно получить старое поведение, используя новый метод Object#try!
.
String#to_date
теперь вызывает ArgumentError: invalid date
вместо NoMethodError: undefined method 'div' for nil:NilClass
при получения неверной даты. Это то же самое, что и Date.parse
, и он принимает больше неправильных дат, чем 3.x, такие как:
# ActiveSupport 3.x
"asdf".to_date # => NoMethodError: undefined method `div' for nil:NilClass
"333".to_date # => NoMethodError: undefined method `div' for nil:NilClass
# ActiveSupport 4
"asdf".to_date # => ArgumentError: invalid date
"333".to_date # => Fri, 29 Nov 2013
Устарел метод ActiveSupport::TestCase#pending
, используйте вместо него skip
из minitest.
ActiveSupport::Benchmarkable#silence
устарел из-за недостатков в тредобезопасности. Он будет убран без замен в Rails 4.1.
Устарел ActiveSupport::JSON::Variable
. Определяйте собственные методы #as_json
и #encode_json
для собственных строковых литер JSON.
Устарел метод совместимости Module#local_constant_names
, используйте вместо него Module#local_constants
(который возвращает символы).
Устарел ActiveSupport::BufferedLogger
. Используйте ActiveSupport::Logger
или logger
из стандартной библиотеки Ruby.
Устарели assert_present
и assert_blank
в пользу assert object.blank?
и assert object.present?
Обратитесь к Changelog за полными изменениями.
Обратитесь к Changelog за полными изменениями.
Улучшены способы написания миграций change
, что делает старые методы up
& down
больше не нужными.
drop_table
и remove_column
теперь обратимые, если дана вся необходимая информация.
Метод remove_column
принимает несколько имен столбцов; вместо использования remove_columns
(который необратимый).
Метод change_table
также обратимый, если его блок не вызывает remove
, change
или change_default
reversible
делает возможным определить код для исполнения при выполнении или откате миграции.
Смотрите руководство Миграции Active Record
revert
обратит всю миграцию или предоставленный блок.
Если миграция откатывается, данная миграция / блок выполняется обычно.
Смотрите руководство Миграции Active Record
Добавлена поддержка массивов PostgreSQL. Для создания столбца array может быть использован любой тип данных, с полной поддержкой миграций и выгрузкой схемы.
Добавлен Relation#load
для явной загрузки записи и возврата self
.
Model.all
теперь возвращает ActiveRecord::Relation
, а не массив с записями. Используйте Relation#to_a
, если вы действительно хотите массив. В некоторых особенных случаях это может вызвать повреждения при апгрейде.
Добавлен ActiveRecord::Migration.check_pending!
, вызывающий ошибку, если миграции ожидают выполнения.
Добавлена поддержка произвольного кодирования для ActiveRecord::Store
. Теперь можно установить собственное кодирование следующим образом:
store :settings, accessors: [ :color, :homepage ], coder: JSON
Соединения mysql
и mysql2
будут по умолчанию устанавливать SQL_MODE=STRICT_ALL_TABLES
, чтобы избежать тихих потерь данных. Это может быть отключено, определив strict: false
в database.yml
.
Убрана IdentityMap.
Убрано автоматическое выполнение запросов EXPLAIN. Опция active_record.auto_explain_threshold_in_seconds
больше не используется и должна быть убрана.
Добавлены ActiveRecord::NullRelation
и ActiveRecord::Relation#none
, реализующие паттерн нулевого объекта для класса Relation.
Добавлен миграционный хелпер create_join_table
для создания соединительных таблиц HABTM.
Могут быть созданы записи PostgreSQL hstore.
Устарел старый API поиска, основанный на хэше. Это означает, что методы, ранее принимающие "опции поиска", больше так не делают.
Устарели все динамические методы, кроме find_by_...
и find_by_...!
устарели. Вот как можно переписать код:
find_all_by_...
может быть переписан с использованием where(...)
.
find_last_by_...
может быть переписан с использованием where(...).last
.
scoped_by_...
может быть переписан с использованием where(...)
.
find_or_initialize_by_...
может быть переписан с использованием find_or_initialize_by(...)
.
find_or_create_by_...
может быть переписан с использованием find_or_create_by(...)
.
find_or_create_by_...!
может быть переписан с использованием find_or_create_by!(...)
.
Взгляните на полный список контрибьюторов Rails, на людей, которые потратили много часов, сделав Rails стабильнее и надёжнее. Спасибо им всем.