Ключевые новинки в 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 стабильнее и надёжнее. Спасибо им всем.