Как рельсы понимают, что прошлая версия приложения и защищает от текущих обновленных изменений - PullRequest
0 голосов
/ 05 февраля 2019

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

Недавно мы обновили наше приложение с 4.2+ -> 5.0.Одним из изменений, которые Rails реализовал в Rails 5, является использование throw(:abort) в before_* обратных вызовах для разрыва цепочки (если это когда-либо понадобится), а использование false просто не будет иметь побочного эффекта (то есть никакого обратного вызовацепь будет остановлена ​​при использовании false) (обратите внимание на это)

Но здесь подвох.Если вы прочитаете this , это ясно говорит о том, что при обновлении с 4.2 -> 5.0 обратные вызовы return false из before_* все равно будут работать (с предупреждением, но будут работать)

вот мой вопрос после обновления, когда у меня заблокирован Rails, AR и AS до версии 5.0.0.1 на моем Gemfile.lock, как Rails узнает, что я обновил приложение с 4.2, и оно должно соответствовать выражению return falseв обратном вызове before_ *, чего не будет, если вы создадите новое приложение в Rails 5.0

Возможно, будет полезна ссылка на исходный код.

1 Ответ

0 голосов
/ 05 февраля 2019

Ответ (Быстрый способ обеспечения совместимости обновления):

Ответ (Подробный способ понять, что изменилось):

  1. Перейти к заметкам о выпуске.то есть https://guides.rubyonrails.org/5_0_release_notes.html
  2. Перейдите в раздел Устаревание , или, если вы уже знаете о каких-либо изменениях, найдите его на этой странице (т.е. найдите текст "throw(:abort)")
  3. Нажмите ссылку «Запрос извлечения» там
  4. Затем перейдите на вкладку «Файлы изменены»
  5. Затем прочитайтевсе файлы CHANGELOG.md;Я цитирую (и отвечаю на ваш вопрос):

    Установка Callbacks::CallbackChain.halt_and_display_warning_on_return_false в значение true позволит приложению поддерживать устаревший способ остановки цепочек обратного вызова, возвращая false.

    Settingзначение false скажет приложению игнорировать любое значение false, возвращаемое обратными вызовами, и останавливать цепочку только при throw(:abort).

    Это значение также можно установить с помощью параметра конфигурации Rails config.active_support.halt_callback_chains_on_return_false.

    Если параметр конфигурации отсутствует, его значение равно true, поэтому старые приложения, портированные на Rails 5.0, не будут работать (но будут отображаться предупреждения об устаревании).Для новых приложений Rails 5.0 его значение установлено в false в инициализаторе, поэтому эти приложения будут поддерживать новое поведение по умолчанию

ОтносительноЕсли вы беспокоитесь о том, чтобы прервать изменения, хорошо иметь в виду, что:

Rails, похоже, использует другую версию "Семантического контроля версий":

Я цитируюот @rafaelfranca здесь :

XYZ

Z - только исправления ошибок, без изменений API.

Y - новые функции, могут содержатьИзменения API.

X - новые функции, будут содержать изменения API.Просто столкнулся в особых случаях

И я цитирую @ robin850 здесь

, когда Y увеличивается, могут быть функции, которые устарели, но онивсе еще доступен, но когда он снова увеличивается, эти функции могут быть недоступны (например, Numeric#ago был доступен в 4.0, устарел в 4.1 и удален в 4.2).

Лично я разработал свои драгоценные камни, используястандартное "семантическое управление версиями", так что

  • любое изменение X означает несовместимое с обратным изменением, и что мои зависимые проекты / код, вероятно, больше не будут работать
  • , в то время как любой Yизменение является обратно-совместимым изменением «функции»
  • , в то время как любое изменение Z обычно является незначительными исправлениями ошибок.

Вот почему, если вы делаете rails new some_project, а затем проверяетеGemfile, вы увидите gem 'rails', '~> 5.2.2'.Потому что если бы Rails был "семантически версионным", он бы выглядел как gem 'rails', '~> 5.2'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...