Rails 5, новый крупный релиз популярного веб-фреймворка, скоро появится, и, конечно, мы с нетерпением ждем этого. Обратитесь к этой статье, если вы хотите прочитать обзор некоторых новых функций, которые будут представлены. Однако сегодня мы собираемся разобраться в некоторых технических деталях, обсудить, какие методы были удалены или устарели, какие параметры были изменены и как перенести существующее приложение Rails 4 на версию 5.
Не забывайте, что после выпуска Rails 5 все исправления ошибок будут представлены только для Rails 5.0.x, тогда как обычные исправления безопасности будут применены к Rails 4.2.x, как указано в официальной политике обслуживания .
Исходный код этого приложения доступен на GitHub .
Препараты
Прежде чем продолжить, необходимо принять во внимание, что для Rails 5 требуется Ruby 2.2.2 или выше, поэтому, если у вас не установлена эта версия, скачайте ее прямо сейчас .
Перед миграцией существующего приложения на Rails 5 я действительно рекомендую иметь надежный набор тестов, иначе процесс миграции может стать гораздо более сложным и болезненным. В этой статье я буду использовать демонстрационное приложение MusicalShop, которое было представлено в моей серии скринкастов RSpec with Rails . Это очень простое приложение на Rails 4, но в нем есть автоматические тесты, написанные на RSpec. Вы можете клонировать последнюю версию приложения из этой ветки .
Также рекомендуется перейти на последнюю версию патча Rails 4 (которая в настоящее время 4.2.5.1). Кроме того, вы можете проверить, что в вашем проекте используются последние возможные версии драгоценных камней, запустив
$ bundle outdated
Однако будьте осторожны, чтобы не вводить никаких конфликтов, явно требуя последних версий для всех ваших драгоценных камней (особенно для зависимостей).
Еще одна вещь, которую следует учитывать, это то, что некоторые гемы могут быть несовместимы с Rails 5, так что будьте к этому готовы. Просмотрите зависимости gem и просмотрите открытые проблемы в GitHub, чтобы выяснить, не сталкиваются ли другие разработчики с проблемами при использовании библиотеки с Rails 5. Некоторые гемы (например, Devise), возможно, потребуется включить непосредственно из master
ветки.
Итак, продолжайте и убедитесь, что тесты работают успешно:
$ rspec .
Не забывайте, что, как сказал Эдсгер Дейкстра, «тестирование никогда не сможет продемонстрировать отсутствие ошибок в программном обеспечении, только их наличие». Но будем надеяться на лучшее.
Последнее, что нужно сделать, это переключиться на другую ветку, чтобы вы всегда могли вернуться к старой версии, если все идет не так, как планировалось:
$ git checkout -b rails5
Перенастройка
Сделайте глубокий вдох и измените свой Gemfile :
Gemfile
[...] gem 'rails', '>= 5.0.0.beta3', '< 5.1' [...]
В настоящее время Rails находится в бета-версии, но кандидат на релиз должен быть опубликован довольно скоро
Бегать
$ bundle update
Вы также можете запустить
$ rake rails:update
который создает новые файлы, представленные в Rails 5, а также модифицирует старые.
В общем, файлы конфигурации Rails 5 очень похожи на Rails 4, поэтому есть вероятность, что вы сможете сразу загрузить свое приложение, увидев некоторые сообщения об устаревании. Некоторые из вас могут помнить, что процесс перехода с Rails 3 на 4 был гораздо более болезненным.
Тем не менее, многие устаревшие методы были удалены , поэтому, если вы использовали какой-либо из них, вам придется соответствующим образом изменить базу кода. Давайте обсудим основные изменения, чтобы вы понимали, какие части приложения больше всего требуют вашего внимания.
Контроллеры
Хорошо, во-первых, давайте посмотрим на изменения, которые касаются контроллеров.
-
Метод
skip_action_callback
полностью удален . -
Параметр
:nothing
для методаrender
не рекомендуется . -
Методы
*_filter
(before_filter
,before_filter
) все еще поддерживаются, но устарели и будут удалены в Rails 5.1.*_action
этого используйте*_action
. -
Хороший метод
redirect_back
вводится в пользуredirect_to :back
. Он пытается перенаправить на HTTP_REFERER или в указанное место, поэтому вы можете использовать его в своих методах:
redirect_back root_path
-
render :text
устарел, так как он не отображаетtext/plain
ответ. Вместо этого используйтеrender :plain
илиrender :html
для отображенияtext/html
страницы:
render plain: 'My text'
-
Методы
respond_to
иrespond_with
были извлечены в гем респондентов , поэтому обязательно включите его в Gemfile, если вы используете эти методы. -
XML-сериализация также была извлечена в отдельный гем activemodel-serializers-xml .
Взгляды
Каждая форма теперь имеет собственный токен CSRF по умолчанию . Это необходимо для предотвращения взлома формы, когда злоумышленник вводит свою собственную форму на страницу, указывающую на какой-либо вредоносный веб-сайт.
Создайте файл инициализатора для глобального контроля этого поведения:
конфиг / Инициализаторы / per_form_csrf_tokens.rb
Rails.application.config.action_controller.per_form_csrf_tokens = true
Или используйте следующую настройку внутри отдельных контроллеров:
self.per_form_csrf_tokens = true
Методы content_tag_for
и div_for
были удалены из ActionView
и извлечены в гем помощника тега записи .
модели
Rails 5 вводит новый абстрактный класс (то есть, его нельзя создать), который называется ApplicationRecord
и все модели наследуют от него по умолчанию, а не от ActiveRecord::Base
. Это сделано, чтобы предотвратить непосредственное исправление ActiveRecord::Base
. Таким образом, вы можете представить все расширения внутри ApplicationRecord
. Если вы хотите использовать эту функциональность, создайте файл application_record.rb внутри каталога моделей :
модели / application_record.rb
class ApplicationRecord < ActiveRecord::Base self.abstract_class = true end
Затем убедитесь, что все модели наследуются от этого нового класса, например:
модели / user.rb
class User < ApplicationRecord [...] end
Еще одно добавление связано с ассоциациями принадлежностью: в Rails 5 соответствующая запись должна присутствовать по умолчанию. Теперь required
опция устарела, и вводится новый optional
параметр. Это означает, что по умолчанию Rails проверяет наличие «родительской» записи перед сохранением объекта. Если вы не хотите использовать это поведение для какой-либо ассоциации, используйте
belongs_to :some_parent, optional: true
Rails 5 также поставляется с активной записью, относящейся к требуемому по умолчанию файлу инициализатора default.rb, который управляет этим поведением для всего приложения. Вы также можете создать его:
конфиг / Инициализаторы / active_record_belongs_to_required_by_default.rb
Rails.application.config.active_record.belongs_to_required_by_default = true
before_*
вызовы before_*
которые возвращают false
в ваших моделях, больше не останавливают цепочку обратных вызовов. Если вы хотите явно остановить цепочку обратных вызовов, используйте throw(:abort)
вместо этого:
def my_callback throw(:abort) if something_bad_happened end
Новые приложения Rails 5 поставляются с файлом инициализатора callback_terminator.rb, который управляет этим поведением:
конфиг / inititalizers / callback_terminator.rb
ActiveSupport.halt_callback_chains_on_return_false = false
Также имейте в виду, что если вы собираетесь использовать Rails с PostgreSQL, поддерживается только версия 9.1 выше.
кэш
Управление кешированием в разработке стало более удобным. В Rails 4 у нас config.action_controller.perform_caching
параметр config.action_controller.perform_caching
который принимает либо true
либо false
. Однако в Rails 5 теперь присутствует следующий фрагмент кода:
конфигурации / среда / development.rb
[...] if Rails.root.join('tmp/caching-dev.txt').exist? config.action_controller.perform_caching = true config.cache_store = :memory_store config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=172800' } else config.action_controller.perform_caching = false config.cache_store = :null_store end [...]
Чтобы включить или отключить кэширование, вы можете запустить команду rake dev:cache
которая создает файл caching-dev.txt в каталоге tmp .
Маршрутизация
Несколько root
маршрутов теперь могут существовать в одной и той же области (ранее возникла ошибка). Вы можете предоставить ограничения и выбрать, какой корень использовать:
root 'blog#show', constraints: ->(req) { some_condition } root 'pages#show'
Команда rails routes
теперь принимает следующие параметры:
поиск конкретных маршрутов:
-
-c
возвращает все маршруты для указанного контроллера -
-g
возвращает маршруты на основе указанного шаблона
тесты
ActionController::TestCase
Методы HTTP-запросов, такие как get
и post
, устарели. Вы должны использовать вместо этого process
. Например, в моих тестах у меня есть такие звонки:
спецификации / контроллеры / albums_controller_spec.rb
[...] get :index [...] post :create, album: {title: ''} [...]
Они должны быть переписаны как
спецификации / контроллеры / albums_controller_spec.rb
[...] process :index, method: :get [...] process :create, method: :post, params: { album: {title: ''} } [...]
Методы assert_template
и assert_template
были извлечены в отдельный гем тестирования rails-controller . Добавьте его в свой Gemfile :
Gemfile
[...] group :test do gem 'rails-controller-testing' end [...]
Если вы используете RSpec как я, добавьте следующие строки в ваш файл rails_helper.rb как временное исправление (RSpec официально пока не поддерживает Rails 5):
спецификации / rails_helper.rb
[...] RSpec.configure do |config| config.include Rails::Controller::Testing::TestProcess config.include Rails::Controller::Testing::TemplateAssertions config.include Rails::Controller::Testing::Integration [...] end
Некоторые другие вещи
Еще одна интересная особенность Rails 5 — все команды rake
теперь живут в rails
(например, rake db:migrate
становится rails db:migrate
).
ActiveRecord::Base.raise_in_transactional_callbacks
устарел и не имеет никакого эффекта. Он будет удален без замены, поэтому вы можете безопасно удалить его из файла config / application.rb .
ActiveJob теперь наследуется от промежуточного класса ApplicationJob
. Создайте файл application_job.rb в каталоге заданий :
работы / application_job.rb
class ApplicationJob < ActiveJob::Base end
Убедитесь, что ваши задания наследуются от ApplicationJob
.
ActionDispatch::Static
принимает пользовательские заголовки HTTP, поэтому вы можете указать пользовательские параметры управления кэшем.
Последнее, что следует отметить, это то, что ActionCable
больше не требует присутствия Redis, EventMachine и Celluloid.
Вывод
Итак, Rails 5 обещает отличный набор новых функций и дополнений, и я действительно призываю вас попробовать. Кроме того, обязательно просмотрите полный список изменений .
Планируете ли вы перейти на Rails 5 в ближайшем будущем? Сколько ваших приложений до сих пор используют Rails 3 (или даже Rails 2)? Поделитесь своим мнением в комментариях!