Статьи

Пример: обновление до Rails 4.1

Эта статья не о том, что в Rails 4.1. Речь идет о том, что мне нужно было сделать, чтобы получить (хотя и простое) производственное приложение, использующее 3.2.18 — 4.1. Если вам нужна статья «Что нового в Rails 4 / 4.1», то интернет изобилует ими, включая замечательную статью нашего собственного Майкла Олаха.

Сегодня я собираюсь перечислить мои шаги, чтобы обновить приложение Rails 3.2.18 до Rails 4.1, используя любые новые соглашения Rails, когда это возможно. Я надеюсь, что мой опыт привносит немного реальности в ваши решения, которые я должен обновить прямо сейчас или в конечном итоге в аду.

Текущее состояние

Как я уже упоминал, приложение, которое я обновляю, в настоящее время работает на Ruby 2.0 и Rails 3.2.18. Это относительно ванильное приложение, использующее Devise для аутентификации и RSpec и Guard для тестирования. База данных — PostgreSQL, и она развернута в Heroku.

Давай доберемся до этого?

Gemfile

Дополнения / изменения

Первое, что нужно сделать, это принять решение о версиях Ruby. Я полагаю, что при переходе на Rails 4.1 я мог бы также перейти на Ruby 2.1. В Ruby 2.1 были некоторые проблемы , некоторые из которых были рассмотрены в 2.1.2. Тем не менее, в 2.1.2 все еще есть кое-что плохое , так что знаете, во что вы ввязываетесь, К?

Кроме того, если вы используете RVM и / или Pow, как я, обязательно измените все .ruby-version.powrc Пау просто .powrcrails '3.2.18'
ruby '2.0.0'

Я изменил линии

 rails '4.1.0'
ruby '2.1.2'

в

 gem 'spring' group: :development

Теперь о новых драгоценных камнях. Большая часть ado вокруг 4.1 сконцентрирована на Spring , блестящем предзагрузчике приложений, который нацелен на удаление времени запуска Rails из нашего коллективного поиска. Как и во всем, что связано с Rails, существует некоторое недовольство сообщества по поводу добавления Spring в соглашения Rails по умолчанию. С одной стороны, он не работает на нескольких больших реализациях, а именно на JRuby или Rubinius. Также он не работает на любой платформе Windows. Когда я впервые прочитал это, я согласился с скептиками. Зачем добавлять что-то, что не работает для такого количества пользователей?

Во всяком случае, я думаю, я попробую это, посмотреть, стоит ли это гомон. Если нет, я напишу пост, осуждающий его как чистое зло. Или что-то.

Добавьте slice

В Rails 4.0 добавлены Strong Parameters , который представляет собой подход к атрибутам белого списка, которые приложение может передать вашей модели. Я использовал аналогичный подход, просто порезав параметры в контроллере по мере необходимости. Это означает, что мне не нужно использовать подход с сильными параметрами, чтобы начать работу, но я могу со временем работать над этим.
Однако, поскольку сейчас я не фиксирую все свои модели / контроллеры на наличие сильных параметров, я должен использовать клейкую ленту в виде гема protected_attributes .

 gem 'protected_attributes`

Переезды

Мой Gemfile включает в себя несколько гемов ( activeuuid и uuidtools ), используемых для добавления поддержки UUID и утилит в мое приложение. В Rails 4.0 улучшена поддержка UUID, поэтому они мне больше не нужны. Если вам нужно значение uuid в вашем приложении, вы можете использовать SecureRandom.uuid Мне также пришлось удалить include ActiveUUID::UUIDactiveuuid пропал.

Gemfile все еще использует группу :assets:assets

Наконец, я долгое время был поклонником гема mailcatcher , но Rails 4.1 добавляет ActionMailer Preview к основному предложению. Таким образом, я собираюсь удалить mailcatcher и роль с новым материалом. Я понимаю, что mailcatcher делает немного больше, чем ActionMailer Preview, но меньше гемов лучше (за исключением случаев, когда это не так).

ОК, все изменения Gemfile сделаны. Время bundle update

Окружающая обстановка

В файлы среды приложения внесены некоторые необходимые изменения. Во-первых, если вы получаете исключение об удалении config.active_record.whitelist_attributesGemfile и добавить protected_attributes . Кроме того, позор, что вы заставили меня повторить себя.

После успешного bundleconfig.eager_load

 config.eager_load is set to nil. Please update your config/environments/*.rb files accordingly:
  * development - set it to false
  * test - set it to false (unless you use a tool that preloads your test environment)
  * production - set it to true

Итак, обновите эти файлы соответственно. Примечание. Если у вас есть «промежуточная» среда, определенная, как я, обязательно внесите соответствующие изменения в этот файл.

При чтении руководства по обновлению Rails упоминается новый сериализатор cookie . За руководство я добавил

 config.action_dispatch.cookies_serializer = :hybrid

в config / application.rb . Это еще один момент, ЧИТАЙТЕ РУКОВОДСТВО. Слепая смена сериализатора файлов cookie может привести к их разрушению, поэтому знайте, почему вы это делаете.

Маршруты

Ключевое слово match Если у вас есть matchфайле config / rout.rb , вы увидите такие аккуратные вещи, как:

 /Users/dood/.rvm/gems/ruby-2.1.2@app/gems/actionpack-4.1.0/lib/action_dispatch/routing/mapper.rb:196:in `normalize_conditions!': You should not use the `match` method in your router without specifying an HTTP method.
If you want to expose your action to both GET and POST, add `via: [:get, :post]` option.
If you want to expose your action to GET, use `get` in the router:
Instead of: match "controller#action"
Do: get "controller#action" (RuntimeError)

У меня есть (шокирующе) большое количество matchget

Секреты

Я думаю, что новый подход к секретам приложений заслуживает отдельного раздела. Раздел руководства по Rails на эту тему стоит прочитать.

конфиг / secrets.yml

Сначала создайте файл config/secrets.yml

 development:
  secret_key_base: <output of rake secret>

test:
  secret_key_base: <output of rake secret>

production:
  secret_key_base: <output of rake secret>

С моим новым файлом секретов пришло время удалить config/initializers/secret_token.rb Если я сделал это правильно, мои куки будут обновлены до новых, более безопасных куки. Опять же, убедитесь, что вы понимаете, что здесь происходит, потому что пути назад нет. Возможно, вы должны быть уверены, что все ваши пользователи имеют новые куки перед обновлением, а руководство по обновлению расскажет вам, как поддерживать оба при необходимости.

Настройки приложения

Мое приложение в настоящее время использует gem settingslogic для хранения настроек моего приложения, которые мне понравились достаточно для использования в нескольких приложениях. Некоторые люди клянутся фигаро , и я понимаю почему. В любом случае, settingslogic добавляет мне достаточно, чтобы я захотел сохранить его. Таким образом, мой файл секретов будет содержать только secret_key_base

Miscenllany

На данный момент у меня, похоже, есть приложение Rails 4.1, которое готово к работе. Честно говоря, я думал, что это будет больше сделки.

Я удалил каталог vendor / plugins . Я получаю предупреждение о том, что плагины не поддерживаются в течение нескольких жизней. Это ушло, наряду с другим небольшим кусочком раздражения Rails.

Поскольку я добавил Spring в Gemfile, мне нужно создать binstubs для того, чтобы Spring был счастлив.

 spring binstub --all

который выплевывает:

 * bin/rake: generated with spring
  * bin/rails: spring inserted

развертывание

Я развертываюсь на Heroku, так что это должно быть несложно, верно? Однако когда вышел Rails 4.0, я попытался развернуть приложение Rails 4 на Heroku, и у конвейера ресурсов были другие мысли. На следующем рисунке я почувствовал, что пытаюсь заставить его работать:

Некоторая комбинация переключателей здесь успешно развернет ваши активы в Heroku. Удачи.

Некоторая комбинация переключателей здесь успешно развернет ваши активы в Heroku. Удачи.

К счастью, время сделало то, что время сделает, и вещи намного улучшились. В этой статье рассматриваются изменения, которые я сделал. По сути, я добавил в свой пакет гем rails_12factor, а затем убедился, что он находится в моем файле config / environment / staging.rb .

 config.serve_static_assets = true

Я думаю, что делать то и другое — излишне, но это сработало, поэтому я медленно отступаю. Если ваши ресурсы (включая application.css и application.js ) являются 404ing, то, что я здесь упоминаю, должно это исправить.

Впечатления

После обновления Rails по-прежнему остается Rails. Если вы помните, я упомянул, что немного беспокоился обо всей Spring, так что давайте запустим консоль rails и посмотрим, замечу ли я какие-либо изменения во времени запуска.

(Через 5 секунд)

Нет, кажется, то же самое. Я просто закрою консоль и открою другую.

(

(Приоткрытый рот)

Это не может быть правдой. Я никогда не видел, чтобы консоль Rails запускалась так быстро.

(Делает это снова, тот же результат.)

(Кажется, легче, но немного грязно, так как все убеждения о том, что весна не работает для всех, покидают тело и разум.)

Вау. Весна имеет огромное значение. Я не могу дождаться, чтобы увидеть, что он делает для RSpec.

(Пожарная guard
(Запускает спецификации несколько раз)

Хммм. Кажется, он ничего не делает для RSpec. Я перезапустил охрану, но спецификации имеют то же время запуска.

(Ищет адвоката от Google, обнаруживает ответ)

Хорошо, есть spring_commands_rspec, который добавляет необходимый binstub. Я bundlespring binstub --rspecspring stop К сожалению, мы еще не закончили. Как я уже упоминал в начале статьи, я использую Guard. По какой-то причине сгенерированный rspecGuardfile я изменил

 guard :rspec do

в

 guard :rspec, cmd: 'bin/rspec' do

и перезапустил guard KABLAMMEY! Мои спецификации теперь запускаются перед включением при каждом сохранении.

Я получаю весну. Извините пользователей JRuby (и других). Если вам от этого станет легче, пара моих гораздо более крупных приложений на Rails — JRuby, поэтому я чувствую вашу боль.

И сейчас?

Что ж, мое приложение обновлено до Rails 4.1 и начнет свою работу на этой неделе. Замечательно. Обновление было по большей части безболезненным, и результаты ощутимы. Так же, как мне это нравится.

Следующие шаги

Следующие шаги состоят в том, чтобы увидеть, какие еще новые биты представляют интерес для базы кода моего приложения. Вещи как:

  • Enums : я не вижу большой ценности здесь. Перечисления имеют смысл только для меня, если у вас есть тип данных, который имеет смысл как целое число, например, флаг. В противном случае, когда вы просматриваете данные в базе данных, вы должны помнить, какое число соответствует какому значению. Я, наверное, просто не понимаю.
  • Верификаторы сообщений : наши почтовые программы Devise делают это с помощью забытых паролей и подтверждений регистрации. Интересно, собираются ли это использовать дети Plataformatec?
  • Относительно : Это «простой способ разделить проблемы размером с кусочек». Это интересно, но не для этого приложения. Может быть, некоторые из моих бегемотов.
  • Варианты : Это приложение не адаптивно, за исключением того, что дал Фонд, что мы плохо выполнили. Нам нужно проделать определенную работу в этой области, так что, держу пари, мы скоро посмотрим.
  • Новые методы тестирования . Некоторые из новых методов тестирования выглядят аккуратно и могут позволить нам сбрасывать больше драгоценных камней. Сброс драгоценных камней, FTW!

Вы уже обновились до Rails 4.1? Впечатления? Мысли? Боль? Поделитесь своим опытом!