Заметки о релизе Ruby on Rails 5.2
Ключевые новинки в Rails 5.2:
Ключевые новинки в Rails 5.2:
- Active Storage
- Хранилище кэша Redis
- HTTP/2 Early Hints
- Учетные данные (Credentials)
- Политика безопасности контента (CSP)
Эти заметки о релизе покрывают только основные изменения. Чтобы узнать о других обновлениях, различных исправлениях программных ошибок и изменениях, обратитесь к логам изменений или к списку коммитов в главном репозитории Rails на GitHub.
Апгрейд до Rails 5.2
Прежде чем апгрейднуть существующее приложение, было бы хорошо иметь перед этим покрытие тестами. Также, до попытки обновиться до Rails 5.2, необходимо сначала произвести апгрейд до Rails 5.1 и убедиться, что приложение все еще выполняется так, как нужно. Список вещей, которые нужно выполнить для апгрейда доступен в руководстве Апгрейд Ruby on Rails.
Основные особенности
Active Storage
Active Storage облегчает загрузку файлов в облачные хранилища данных, такие как Amazon S3, Google Cloud Storage или Microsoft Azure Storage, и прикрепляет эти файлы к объектам Active Record. Он поставляется с локальным на основе диска сервисом для разработки и тестирования, и поддерживает отзеркаливание (mirroring) файлов в подчиненных сервисах для резервного копирования и миграций. Подробнее об Active Storage можно прочитать в руководстве Обзор Active Storage.
Хранилище кэша Redis
Rails 5.2 поставляется со встроенным хранилищем кэша Redis. Подробнее об этом можно прочитать в руководстве Кэширование с Rails: Обзор.
HTTP/2 Early Hints
Rails 5.2 поддерживает HTTP/2 Early Hints. Чтобы запустить сервер с включенными Early Hints, необходимо передать --early-hints вместе с bin/rails server.
Учетные данные
Добавлен файл config/credentials.yml.enc для хранения секретов приложения в production. Это разрешает сохранять любые учетные данные аутентификации для сторонних сервисов напрямую в репозиторий, зашифрованный с помощью ключа в файле config/master.key или переменной среды RAILS_MASTER_KEY. Это в конечном итоге заменит Rails.application.secrets и зашифрованные секреты, представленные в Rails 5.1. Кроме того, Rails 5.2 открывает API соответствующие учетным данным, поэтому можно легко справиться с другими зашифрованными конфигурациями, ключами и файлами.
Подробнее об этом можно узнать в руководстве Безопасность приложений на Rails.
Политика безопасности контента
Rails 5.2 поставляется с новым DSL, который разрешает конфигурировать политику безопасности контента для приложения. Также можно сконфигурировать глобальную дефолтную политику, а затем переопределить ее отдельно для каждого ресурса и даже использовать лямбды для ввода значений для каждого запроса в заголовок, такой как поддомены аккаунта в многопользовательском (multi-tenant) приложении.
Подробнее об этом можно узнать в руководстве руководстве Безопасность приложений на Rails.
Railties
За подробностями обратитесь к Changelog.
Устарело
-
Устарел метод
capify!в генераторах и шаблонах. (Pull Request) -
Передача имени среды в качестве обычного аргумента устарела для команд
rails dbconsoleиrails console. Вместо этого следует использовать опцию-e. (Commit) -
Устарело использование подкласса
Rails::Applicationдля запуска сервера Rails. (Pull Request) -
Устарел колбэк
after_bundleв шаблонах плагина Rails. (Pull Request)
Значимые изменения
-
Добавлен общий раздел
config/database.yml, который будет загружен для всех сред. (Pull Request) -
Добавлен
railtie.rbв генератор плагина. (Pull Request) -
Очистка скриншотов в задаче
tmp:clear. (Pull Request) -
Пропуск неиспользуемых компонентов при запуске
bin/rails app:update. Если начальная генерация приложения пропустила Action Cable, Active Record и т.д., задача update учтет эти пропуски тоже. (Pull Request) -
Разрешает передачу имени собственного соединения в команду
rails dbconsoleпри использовании 3-уровневой конфигурации базы данных. Пример:bin/rails dbconsole -c replica. (Commit) -
Правильно расширены краткие формы для имени среды, запускающие команды
consoleиdbconsole. (Commit) -
Добавлен
bootsnapвGemfileпо умолчанию. (Pull Request) -
Поддержка
-как платформо-агностического способа для запуска скрипта из stdin с помощьюrails runner(Pull Request) -
Добавлена версия
ruby x.x.xвGemfileи создан корневой файл.ruby-version, содержащий текущую версию Ruby при создании нового приложения Rails. (Pull Request) -
Добавлена опция
--skip-action-cableв генератор плагина. (Pull Request) -
Добавлен
git_sourceвGemfileдля генератора плагина. (Pull Request) -
Пропуск неиспользуемых компонентов при запуске
bin/railsв плагинах Rails. (Commit) -
Оптимизированы отступы для экшнов генератора. (Pull Request)
-
Оптимизированы отступы маршрутов. (Pull Request)
-
Добавлена опция
--skip-yarnв генератор плагина. (Pull Request) -
Поддержка нескольких версий аргументов для метода
gemв Generators. (Pull Request) -
Вынесен
secret_key_baseиз имени приложения в средах разработки и тестирования. (Pull Request) -
Добавлен
mini_magickкак комментарий в дефолтныйGemfile. (Pull Request) -
rails newиrails plugin newполучаютActive Storageпо умолчанию. Добавлена возможность пропускатьActive Storageс помощью--skip-active-storageи делать это автоматически, если используется--skip-active-record. (Pull Request)
Action Cable
За подробностями обратитесь к Changelog.
Удалено
- Удален устаревший событийный адаптер redis. (Commit)
Значимые изменения
-
Добавлена поддержка для опций
host,port,dbиpasswordв cable.yml (Pull Request) -
Длинные идентификаторы потока хэша при использовании адаптера PostgreSQL. (Pull Request)
Action Pack
За подробностями обратитесь к Changelog.
Удалено
- Удален устаревший
ActionController::ParamsParser::ParseError. (Commit)
Устарело
- Устарели псевдонимы
#success?,#missing?и#error?дляActionDispatch::TestResponse. (Pull Request)
Значимые изменения
-
Добавлена поддержка для рециркулируемых (recyclable) ключей кэша с кэшированием фрагментов. (Pull Request)
-
Изменен формат ключа кэша для фрагментов, чтобы упростить отладку количества отказов (churn) ключа. (Pull Request)
-
AEAD зашифровывает куки и сессии с помощью GCM. (Pull Request)
-
Защита от подделка запроса по умолчанию. (Pull Request)
-
Принудительное истечение срока действия подписанных/зашифрованных куки на стороне сервера. (Pull Request)
-
Опция куки
:expiresподдерживает объектActiveSupport::Duration. (Pull Request) -
Использование зарегистрированной конфигурации сервера
:pumaв Capybara. (Pull Request) -
Упрощены куки промежуточной программы с помощью поддержки ротации ключа. (Pull Request)
-
Добавлена возможность включения Early Hints для HTTP/2. (Pull Request)
-
Добавлена поддержка headless chrome для системных тестов. (Pull Request)
-
Добавлена опция
:allow_other_hostв методredirect_back. (Pull Request) -
Делает
assert_recognizesдля обхода монтированных engines. (Pull Request) -
Добавлен DSL для конфигурирования заголовка Content-Security-Policy. (Pull Request, Commit, Commit)
-
Зарегистрированы самые популярные audio/video/font типы MIME, поддерживаемые современными браузерами. (Pull Request)
-
Изменен вывод результата дефолтного системного скриншота теста с
inlineнаsimple. (Commit) -
Добавлена поддержка headless firefox для системных тестов. (Pull Request)
-
Добавлены безопасные
X-Download-OptionsиX-Permitted-Cross-Domain-Policiesв дефолтный набор заголовков. (Commit) -
Изменены системные тесты для установки Puma как сервера по умолчанию, только если пользователь не указал вручную другой сервер. (Pull Request)
-
Добавлен заголовок
Referrer-Policyв дефолтный набор заголовков. (Commit) -
Совпадение поведения
Hash#eachRails 5.2 с поведением в Rails 4 дляActionController::Parameters#each. (Pull Request) -
Добавлена поддержка автоматического генератора nonce для Rails UJS. (Commit)
-
Обновлено дефолтное значение max-age в HSTS до 31536000 секунд (1 год), чтобы приспособиться к минимальному требованию max-age для https://hstspreload.org/. (Commit)
-
Добавлен метод псевдонима
to_hashвto_hдляcookies. Добавлен метод псевдонимаto_hвto_hashдляsession. (Commit)
Action View
За подробностями обратитесь к Changelog.
Удалено
- Удален устаревший обработчик Erubis ERB. (Commit)
Устарело
- Устарел хелпер
image_alt, который использовался для добавления дефолтного тега alt к изображениям, сгенерированнымimage_tag. (Pull Request)
Значимые изменения
-
Добавлен тип
:jsonвauto_discovery_link_tagдля поддержки ленты JSON. (Pull Request) -
Добавлена опция
srcsetв хелперimage_tag. (Pull Request) -
Исправлены проблемы с
field_error_procдляoptgroupоборачивания и выбора разделителяoption. (Pull Request) -
Изменен
form_with, чтобы генерировать идентификаторы по умолчанию. (Commit) -
Добавлен хелпер
preload_link_tag. (Pull Request) -
Разрешает использование вызываемых объектов как групповых методов для сгруппированных выборок. (Pull Request)
Action Mailer
За подробностями обратитесь к Changelog.
Значимые изменения
-
Разрешает классы Action Mailer для конфигурирования своего задания по доставке. (Pull Request)
-
Добавлен тестовый хелпер
assert_enqueued_email_with. (Pull Request)
Active Record
За подробностями обратитесь к Changelog.
Удалено
-
Удален устаревший
#migration_keys. (Pull Request) -
Удалена устаревшая поддержка
quoted_idпри приведении типа (typecasting) объекта Active Record. (Commit) -
Удален устаревший аргумент
defaultизindex_name_exists?. (Commit) -
Удалена устаревшая поддержка для передачи класса
:class_nameв связях. (Commit) -
Удалены устаревшие методы
initialize_schema_migrations_tableиinitialize_internal_metadata_table. (Commit) -
Удален устаревший метод
supports_migrations?. (Commit) -
Удален устаревший метод
supports_primary_key?. (Commit) -
Удален устаревший метод
ActiveRecord::Migrator.schema_migrations_table_name. (Commit) -
Удален устаревший аргумент
nameиз#indexes. (Commit) -
Удалены устаревшие аргументы из
#verify!. (Commit) -
Удалена устаревшая конфигурация
.error_on_ignored_order_or_limit. (Commit) -
Удален устаревший метод
#scope_chain. (Commit) -
Удален устаревший метод
#sanitize_conditions. (Commit)
Устарело
-
Устарел
supports_statement_cache?. (Pull Request) -
Устарела одновременная передача аргументов и блока для
countиsumвActiveRecord::Calculations. (Pull Request) -
Устарело делегирование для
arelвRelation. (Pull Request) -
Устарел метод
set_stateвTransactionState. (Commit) -
Устарел
expand_hash_conditions_for_aggregatesбез замены. (Commit)
Значимые изменения
-
При вызове динамических фикстур акцессор-метода без аргументов теперь возвращает все фикстуры этого типа. Ранее этот метод всегда возвращал пустой массив. (Pull Request)
-
Исправлена несогласованность с измененными атрибутами при переопределении ридер-атрибута Active Record. (Pull Request)
-
Поддержка убывающих индексов (descending indexes) для MySQL. (Pull Request)
-
Исправлена
bin/rails db:forwardдля первой миграции. (Commit) -
Вызов ошибки
UnknownMigrationVersionErrorна движении (movement) миграций, когда текущая миграция не существует. (Commit) -
Соблюдение
SchemaDumper.ignore_tablesв задачах rake для выгрузки структуры баз данных. (Pull Request) -
Добавлен
ActiveRecord::Base#cache_version, чтобы поддерживать рециркулируемые ключи кэша с помощью новых версий записей вActiveSupport::Cache. Это также означает, чтоActiveRecord::Base#cache_keyтеперь будет возвращать стабильный ключ, который больше не будет содержать временных меток. (Pull Request) -
Предотвращено создание связанных параметров (bind param), если приведенное значение равно nil. (Pull Request)
-
Использование массового (bulk) INSERT для вставки фикстур для лучшей производительности. (Pull Request)
-
Слияние двух relations, представляющих вложенные joins, больше не преобразует joins слитого relation в LEFT OUTER JOIN. (Pull Request)
-
Раньше, если имелась вложенная транзакция и для внешней транзакции был сделан откат, запись из внутренней транзакции по-прежнему была бы отмечена как персистентная. Это было исправлено путем применения состояния родительской транзакции к дочерней транзакции, когда был сделан откат родительской транзакции. Это будет правильно отмечать записи из внутренней транзакции, поскольку они не являются персистентными. (Commit)
-
Исправлена ленивая загрузка/предварительная загрузка связи со скоупом, включающим joins. (Pull Request)
-
Предотвращены ошибки, вызванные подписчиками уведомлений
sql.active_record, которые будут преобразованы к исключениямActiveRecord::StatementInvalid. (Pull Request) -
Пропуск кэширования запроса при работе с пакетом записей (
find_each,find_in_batches,in_batches). (Commit) -
Изменена булева сериализацию sqlite3 для использования 1 и 0. SQLite изначально распознает 1 и 0 как true и false, но не распознает 't' и 'f' как было сериализовано ранее. (Pull Request)
-
Значения, построенные с использованием многопараметрического назначения, теперь будут использовать значение post-type-cast для рендеринга в полях ввода формы единственного поля. (Commit)
-
ApplicationRecordбольше не генерируется при генерации моделей. Если необходимо сгенерировать его, можно создать с помощьюrails g application_record. (Pull Request) -
Relation#orтеперь принимает два relations, у которых разные значения только дляreferences, так какreferencesмогут быть неявно вызваныwhere. (Commit) -
При использовании
Relation#or, извлекаются общие условия и помещаются они до условия OR. (Pull Request) -
Добавлен метод хелпера
binaryдля фикстур. (Pull Request) -
Автоматическое угадывание обратных связей для STI. (Pull Request)
-
Добавлен новый класс ошибок
LockWaitTimeout, который будет вызываться при превышении ожидания тайм-аута блокировки. (Pull Request) -
Обновлены имена полезной нагрузки для инструментария
sql.active_record, чтобы был более наглядным. (Pull Request) -
Использование заданного алгоритма при убирании индекса из базы данных. (Pull Request)
-
Передача
SetвRelation#whereтеперь ведет себя так же, как передача массива. (Commit) -
PostgreSQL
tsrangeтеперь сохраняет досекундную точность. (Pull Request) -
Вызывается при вызове
lock!в грязной (dirty) записи. (Commit) -
Исправлена программная ошибка, при которой порядки столбцов для индекса не записывались в
db/schema.rb, когда используется адаптер SQLite. (Pull Request) -
Исправлен
bin/rails db:migrateс указаннойVERSION.bin/rails db:migrateс пустым VERSION ведет себя как безVERSION. Проверен форматVERSION: Разрешен номер версии миграции или имя файла миграции. Вызывается ошибка, если форматVERSIONнедействителен. Вызывается ошибка, если целевая миграция не существует. (Pull Request) -
Добавлен новый класс ошибок
StatementTimeout, который будет вызываться при превышении тайм-аута выражения. (Pull Request) -
update_allтеперь передает свои значения вType#castдо передачи их вType#serialize. Это означает, чтоupdate_all(foo: 'true')будет должным образом делать персистентным булево значение. (Commit) -
Теперь требуется, чтобы фрагменты на чистом SQL были явно отмечены при использовании в методах запроса relation. (Commit, Commit)
-
Добавлен
#up_onlyв миграции базы данных для кода, который актуален только для метода up в миграциях, например, для заполнения нового столбца. (Pull Request) -
Добавлен новый класс ошибок
QueryCanceled, который будет вызываться при отмене выражения из-за запроса пользователя. (Pull Request) -
Теперь не разрешено определять скоупы, которые конфликтовали с методами экземпляра на
Relation. (Pull Request) -
Добавлена поддержка для классов оператора PostgreSQL в
add_index. (Pull Request) -
Логирование вызывающих методов запроса из базы данных. (Pull Request, Pull Request, Pull Request)
-
Неопределенные методы атрибута на потомках при сбросе информации о столбцах. (Pull Request)
-
Использование subselect для
delete_allсlimitилиoffset. (Commit) -
Исправлена несогласованность с
first(n)при использовании сlimit(). Метод поискаfirst(n)теперь учитываетlimit(), делает это в соответствии сrelation.to_a.first(n), а также с поведениемlast(n). (Pull Request) -
Исправлена вложенная связь
has_many :throughна неперсистентных экземплярах родителя. (Commit) -
Принятие во внимание условий связи при удалении через записи. (Commit)
-
Не разрешает мутировать уничтоженный объект после вызова
saveилиsave!. (Commit) -
Исправлена проблема слияния relation с помощью
left_outer_joins. (Pull Request) -
Поддержка внешних таблиц PostgreSQL. (Pull Request)
-
Очистка состояние транзакции, когда объект Active Record был дублирован (duped). (Pull Request)
-
Исправлена проблема не расширения при передаче объекта Array как аргумента методу where используя столбец
composed_of. (Pull Request) -
Делает вызов
reflection.klass, еслиpolymorphic?не будет использоваться. (Commit) -
Исправлен
#columns_for_distinctдля MySQL и PostgreSQL, чтобы заставитьActiveRecord::FinderMethods#limited_ids_forиспользовать правильные значения первичного ключа, даже если столбцыORDER BYвключают первичный ключ другой таблицы. (Commit) -
Исправлена проблема
dependent: :destroyдля отношений has_one/belongs_to, где родительский класс удалялся, когда дочернего не было. (Commit) -
Простаивающие соединения с базой данных (ранее просто соединения без родительского процесса) теперь периодически закрываются с помощью connection pool reaper. (Commit)
Active Model
За подробностями обратитесь к Changelog.
Значимые изменения
-
Исправлены методы
#keys,#valuesвActiveModel::Errors. Изменен#keys, чтобы возвращал только ключи, у которых нет пустых сообщений. Изменен#values, чтобы возвращал только непустые значения. (Pull Request) -
Добавлен метод
#merge!дляActiveModel::Errors. (Pull Request) -
Разрешает передачу Proc или Symbol в опции length валидатора. (Pull Request)
-
Теперь выполняется валидация
ConfirmationValidator, когда значение_confirmationравноfalse. (Pull Request) -
Модели, использующие API атрибутов с дефолтными proc, теперь могут быть маршализованы. (Commit)
-
Теперь не теряются все множественные
:includesс опциями в сериализации. (Commit)
Active Support
За подробностями обратитесь к Changelog.
Удалено
-
Убраны устаревшие строковые фильтры
:ifи:unlessдля колбэков. (Commit) -
Убрана устаревшая опция
halt_callback_chains_on_return_false. (Commit)
Устарело
-
Устарел метод
Module#reachable?. (Pull Request) -
Устарел
secrets.secret_token. (Commit)
Значимые изменения
-
Добавлен
fetch_valuesдляHashWithIndifferentAccess. (Pull Request) -
Добавлена поддержка для
:offsetвTime#change. (Commit) -
Добавлена поддержка для
:offsetи:zoneвActiveSupport::TimeWithZone#change. (Commit) -
Пропуск имени гема и прогноз устаревания для уведомлений об устаревании. (Pull Request)
-
Добавлена поддержка для версионированных записей кэша. Это позволяет хранилищам кэша рециркулировать (recycle) ключи кэша, что значительно экономит на хранении в случаях с частым количеством отказов. Работает вместе с разделением
#cache_keyи#cache_versionв Active Record и его использованием в кэшировании фрагмента Action Pack. (Pull Request) -
Добавлен
ActiveSupport::CurrentAttributes, чтобы предоставить тредоизолированные атрибуты синглтон. Основные случаи использования это удержание всех атрибутов каждого запроса легко доступными для всей системы. (Pull Request) -
#singularizeи#pluralizeтеперь учитывают неисчисляемые существительные для указанной локали. (Commit) -
Добавлена дефолтная опция
class_attribute. (Pull Request) -
Добавлены
Date#prev_occurringиDate#next_occurring, чтобы возвращать указанный следующий/предыдущий день недели. (Pull Request) -
Добавлена опция default для атрибутов акцессоров модуля и класса. (Pull Request)
-
Кэш:
write_multi. (Pull Request) -
Теперь по умолчанию
ActiveSupport::MessageEncryptorиспользуется шифрование AES 256 GCM. (Pull Request) -
Добавлен хелпер
freeze_time, который замораживает времяTime.nowв тестах. (Pull Request) -
Делает порядок элементов
Hash#reverse_merge!в соответствии сHashWithIndifferentAccess. (Pull Request) -
Добавлены поддержка назначения и истечения срока действия для
ActiveSupport::MessageVerifierиActiveSupport::MessageEncryptor. (Pull Request) -
Обновлен
String#camelize, чтобы предоставлять обратную связь передаче неправильной опции. (Pull Request) -
Module#delegate_missing_toтеперь вызываетDelegationError, если цель равна нулю, аналогичноModule#delegate. (Pull Request) -
Добавлены
ActiveSupport::EncryptedFileиActiveSupport::EncryptedConfiguration. (Pull Request) -
Добавлен
config/credentials.yml.enc, чтобы хранить секреты приложения в production. (Pull Request) -
Добавлена поддержка ротации ключа в
MessageEncryptorиMessageVerifier. (Pull Request) -
Теперь возвращается экземпляр
HashWithIndifferentAccessизHashWithIndifferentAccess#transform_keys. (Pull Request) -
Hash#sliceтеперь вызывает встроенное определение Ruby 2.5+, если оно определено. (Commit) -
IO#to_jsonтеперь возвращает представлениеto_s, вместо того, чтобы пытаться преобразовать в массив. Это исправляет программную ошибку, в которойIO#to_jsonвызываетIOErrorпри вызове нечитабельного объекта. (Pull Request) -
Добавлена одинаковая сигнатура метода для
Time#prev_dayиTime#next_dayв соответствии сDate#prev_day,Date#next_day. Разрешает аргумент дляTime#prev_dayиTime#next_day. (Commit) -
Добавлена одинаковая сигнатура метода для
Time#prev_monthиTime#next_monthв соответствии сDate#prev_month,Date#next_month. Разрешает аргумент дляTime#prev_monthиTime#next_month. (Commit) -
Добавлена одинаковая сигнатура метода для
Time#prev_yearиTime#next_yearв соответствии сDate#prev_year,Date#next_year. Разрешает аргумент дляTime#prev_yearиTime#next_year. (Commit) -
Исправлена поддержка акронима в
humanize. (Commit) -
Разрешает
Range#include?работать на интервалах TWZ. (Pull Request) -
Кэш: Включено сжатие по умолчанию для значений > 1 Кб. (Pull Request)
-
Хранилище кэша Redis. (Pull Request, Pull Request)
-
Обрабатывает ошибки
TZInfo::AmbiguousTime. (Pull Request) -
MemCacheStore: Поддержка истечения сроков действия счетчиков. (Commit)
-
Теперь
ActiveSupport::TimeZone.allвозвращает только часовых поясов, находящихся вActiveSupport::TimeZone::MAPPING. (Pull Request) -
Изменяет поведение по умолчанию
ActiveSupport::SecurityUtils.secure_compare, чтобы не отображать информацию об утечке даже для строки переменной длины. Переименован старыйActiveSupport::SecurityUtils.secure_compareвfixed_length_secure_compare, и начат вызовArgumentErrorв случае несоответствия длины переданных строк. (Pull Request) -
Теперь используется SHA-1 для генерации нечувствительных дайджестов, таких как заголовок ETag. (Pull Request, Pull Request)
-
assert_changesвсегда будет утверждать, что выражение изменяется, вне зависимости от комбинаций аргументовfrom:иto:. (Pull Request) -
Добавлен отсутствующий инструментарий для
read_multiвActiveSupport::Cache::Store. (Pull Request) -
Поддержка хэша как первого аргумента в
assert_difference. Это разрешает указать несколько числовых различий в одном утверждении. (Pull Request) -
Кэширование: MemCache и Redis
read_multiи ускорение (speedup)fetch_multi. Чтение из локального кэша, хранящегося в памяти до обращения к бэкенду. (Commit)
Active Job
За подробностями обратитесь к Changelog.
Значимые изменения
- Разрешить передачу блока в
ActiveJob::Base.discard_on, чтобы разрешить собственную обработку заданий сброса. (Pull Request)
Руководства Ruby on Rails
За подробностями обратитесь к Changelog.
Значимые изменения
-
Добавлено руководство Треды и выполнение кода в Rails. (Pull Request)
-
Добавлено руководство Обзор Active Storage. (Pull Request)
Благодарности
Взгляните на полный список контрибьюторов Rails, на людей, которые потратили много часов, сделав Rails стабильнее и надёжнее. Спасибо им всем.