Статьи

Вперед к Rails 5: дополнения, изменения и устаревания

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' 

Взгляды

Каждая форма теперь имеет собственный токен 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)? Поделитесь своим мнением в комментариях!