1. 升级到 Rails 5.2
如果您正在升级现有应用程序,最好在升级之前有良好的测试覆盖率。如果您尚未升级到 Rails 5.1,您应该首先升级到 Rails 5.1,并确保您的应用程序在尝试升级到 Rails 5.2 之前仍然按预期运行。在升级 Ruby on Rails 指南中列出了升级时需要注意的事项。
2. 主要特性
2.1. Active Storage
Active Storage 方便将文件上传到 Amazon S3、Google Cloud Storage 或 Microsoft Azure Storage 等云存储服务,并将这些文件附加到 Active Record 对象。它附带一个基于本地磁盘的服务用于开发和测试,并支持将文件镜像到从属服务进行备份和迁移。您可以在Active Storage 概述指南中阅读有关 Active Storage 的更多信息。
2.2. Redis 缓存存储
Rails 5.2 附带内置的 Redis 缓存存储。您可以在使用 Rails 缓存:概述指南中阅读有关此内容的更多信息。
2.3. HTTP/2 Early Hints
Rails 5.2 支持 HTTP/2 Early Hints。要启用 Early Hints 启动服务器,请将 --early-hints 传递给 bin/rails server。
2.4. 凭据
添加了 config/credentials.yml.enc 文件来存储生产应用程序密钥。它允许直接在仓库中加密存储第三方服务的任何身份验证凭据,密钥位于 config/master.key 文件或 RAILS_MASTER_KEY 环境变量中。这最终将取代 Rails.application.secrets 和 Rails 5.1 中引入的加密密钥。此外,Rails 5.2 开放了凭据底层 API,因此您可以轻松处理其他加密配置、密钥和文件。您可以在保护 Rails 应用程序指南中阅读有关此内容的更多信息。
2.5. 内容安全策略
Rails 5.2 附带了一个新的 DSL,允许您为应用程序配置内容安全策略。您可以配置一个全局默认策略,然后按资源覆盖它,甚至可以使用 lambda 将每个请求的值注入到标头中,例如多租户应用程序中的帐户子域。您可以在保护 Rails 应用程序指南中阅读有关此内容的更多信息。
3. Railties
请参阅更改日志了解详细更改。
3.1. 弃用
弃用生成器和模板中的
capify!方法。 (拉取请求)弃用将环境名称作为常规参数传递给
rails dbconsole和rails console命令。应改用-e选项。 (提交)弃用使用
Rails::Application的子类来启动 Rails 服务器。 (拉取请求)弃用 Rails 插件模板中的
after_bundle回调。 (拉取请求)
3.2. 显著变化
在
config/database.yml中添加了一个共享部分,该部分将为所有环境加载。 (拉取请求)将
railtie.rb添加到插件生成器。 (拉取请求)在
tmp:clear任务中清除屏幕截图文件。 (拉取请求)运行
bin/rails app:update时跳过未使用的组件。如果初始应用程序生成跳过了 Action Cable、Active Record 等,更新任务也会遵循这些跳过。 (拉取请求)当使用 3 级数据库配置时,允许将自定义连接名称传递给
rails dbconsole命令。示例:bin/rails dbconsole -c replica。 (提交)运行
console和dbconsole命令时,正确展开环境名称的快捷方式。 (提交)将
bootsnap添加到默认Gemfile。 (拉取请求)支持
-作为与平台无关的方式,通过rails runner从标准输入运行脚本 (拉取请求)在创建新的 Rails 应用程序时,将
ruby x.x.x版本添加到Gemfile并创建包含当前 Ruby 版本的.ruby-version根文件。 (拉取请求)将
--skip-action-cable选项添加到插件生成器。 (拉取请求)为插件生成器添加
git_source到Gemfile。 (拉取请求)在 Rails 插件中运行
bin/rails时跳过未使用的组件。 (提交)优化生成器操作的缩进。 (拉取请求)
优化路由缩进。 (拉取请求)
将
--skip-yarn选项添加到插件生成器。 (拉取请求)支持生成器
gem方法的多个版本参数。 (拉取请求)在开发和测试环境中,从应用程序名称派生
secret_key_base。 (拉取请求)将
mini_magick作为注释添加到默认Gemfile。 (拉取请求)rails new和rails plugin new默认获取Active Storage。添加跳过Active Storage的功能,使用--skip-active-storage,并在使用--skip-active-record时自动跳过。 (拉取请求)
4. Action Cable
请参阅更改日志了解详细更改。
4.1. 移除
- 删除了已弃用的 evented redis 适配器。 (提交)
4.2. 显著变化
5. Action Pack
请参阅更改日志了解详细更改。
5.1. 移除
- 删除已弃用的
ActionController::ParamsParser::ParseError。 (提交)
5.2. 弃用
- 弃用
ActionDispatch::TestResponse的#success?、#missing?和#error?别名。 (拉取请求)
5.3. 显著变更
添加对碎片缓存可回收缓存键的支持。 (拉取请求)
更改碎片的缓存键格式,使其更容易调试键流失。 (拉取请求)
使用 GCM 进行 AEAD 加密 Cookie 和会话。 (拉取请求)
默认情况下防止伪造。 (拉取请求)
强制执行签名/加密 Cookie 在服务器端过期。 (拉取请求)
Cookie
:expires选项支持ActiveSupport::Duration对象。 (拉取请求)使用 Capybara 注册的
:puma服务器配置。 (拉取请求)简化支持密钥轮换的 Cookie 中间件。 (拉取请求)
添加为 HTTP/2 启用 Early Hints 的功能。 (拉取请求)
为系统测试添加无头 Chrome 支持。 (拉取请求)
为
redirect_back方法添加:allow_other_host选项。 (拉取请求)使
assert_recognizes遍历已挂载的引擎。 (拉取请求)注册现代浏览器支持的最流行的音频/视频/字体 MIME 类型。 (拉取请求)
将默认系统测试屏幕截图输出从
inline更改为simple。 (提交)为系统测试添加无头 Firefox 支持。 (拉取请求)
在默认标头集中添加安全的
X-Download-Options和X-Permitted-Cross-Domain-Policies。 (提交)更改系统测试,仅当用户未手动指定其他服务器时,才将 Puma 设置为默认服务器。 (拉取请求)
将
Referrer-Policy标头添加到默认标头集中。 (提交)使
ActionController::Parameters#each的行为与Hash#each一致。 (拉取请求)添加对 Rails UJS 自动 nonce 生成的支持。 (提交)
将默认 HSTS max-age 值更新为 31536000 秒(1 年),以满足 https://hstspreload.org/ 的最小 max-age 要求。 (提交)
为
cookies添加别名方法to_hash到to_h。为session添加别名方法to_h到to_hash。 (提交)
6. Action View
请参阅更改日志了解详细更改。
6.1. 移除
- 删除已弃用的 Erubis ERB 处理程序。 (提交)
6.2. 弃用
- 弃用
image_alt助手,它用于为image_tag生成的图像添加默认 alt 文本。 (拉取请求)
6.3. 显著变更
为
auto_discovery_link_tag添加:json类型以支持 JSON Feeds。 (拉取请求)为
image_tag助手添加srcset选项。 (拉取请求)修复
field_error_proc包装optgroup和选择分隔符option的问题。 (拉取请求)更改
form_with默认生成 ID。 (提交)添加
preload_link_tag助手。 (拉取请求)允许使用可调用对象作为分组选择的分组方法。 (拉取请求)
7. Action Mailer
请参阅更改日志了解详细更改。
7.1. 显著变化
8. Active Record
请参阅更改日志了解详细更改。
8.1. 移除
删除已弃用的
#migration_keys。 (拉取请求)删除已弃用的
quoted_id支持,当对 Active Record 对象进行类型转换时。 (提交)删除
index_name_exists?中已弃用的参数default。 (提交)删除关联中向
:class_name传递类名的已弃用支持。 (提交)删除已弃用的方法
initialize_schema_migrations_table和initialize_internal_metadata_table。 (提交)删除已弃用的方法
supports_migrations?。 (提交)删除已弃用的方法
supports_primary_key?。 (提交)删除已弃用的方法
ActiveRecord::Migrator.schema_migrations_table_name。 (提交)删除
#indexes中已弃用的参数name。 (提交)删除
#verify!中已弃用的参数。 (提交)删除已弃用的配置
.error_on_ignored_order_or_limit。 (提交)删除已弃用的方法
#scope_chain。 (提交)删除已弃用的方法
#sanitize_conditions。 (提交)
8.2. 弃用
弃用
supports_statement_cache?。 (拉取请求)弃用在
ActiveRecord::Calculations中同时向count和sum传递参数和块。 (拉取请求)弃用
Relation中对arel的委托。 (拉取请求)弃用
TransactionState中的set_state方法。 (提交)弃用
expand_hash_conditions_for_aggregates,无替代。 (提交)
8.3. 显著变更
当调用不带参数的动态 fixture 访问器方法时,它现在返回所有此类型的 fixture。以前此方法总是返回一个空数组。 (拉取请求)
修复覆盖 Active Record 属性读取器时更改属性的不一致性。 (拉取请求)
支持 MySQL 的降序索引。 (拉取请求)
修复
bin/rails db:forward第一次迁移。 (提交)当当前迁移不存在时,在迁移移动时引发
UnknownMigrationVersionError错误。 (提交)在数据库结构转储的 rake 任务中遵守
SchemaDumper.ignore_tables。 (拉取请求)添加
ActiveRecord::Base#cache_version以通过ActiveSupport::Cache中的新版本条目支持可回收缓存键。这也意味着ActiveRecord::Base#cache_key现在将返回一个稳定的键,不再包含时间戳。 (拉取请求)如果强制转换值为 nil,则阻止创建绑定参数。 (拉取请求)
使用批量 INSERT 插入 fixture 以获得更好的性能。 (拉取请求)
合并代表嵌套连接的两个关系不再将合并关系的连接转换为 LEFT OUTER JOIN。 (拉取请求)
修复事务以将状态应用于子事务。以前,如果您有一个嵌套事务并且外部事务回滚,则内部事务中的记录仍将被标记为已持久化。它通过在父事务回滚时将父事务的状态应用于子事务来修复。这将正确地将内部事务中的记录标记为未持久化。 (提交)
修复包含连接作用域的关联的预加载/急切加载。 (拉取请求)
阻止
sql.active_record通知订阅者引发的错误转换为ActiveRecord::StatementInvalid异常。 (拉取请求)处理批量记录(
find_each、find_in_batches、in_batches)时跳过查询缓存。 (提交)将 sqlite3 布尔值序列化更改为使用 1 和 0。SQLite 原生识别 1 和 0 为 true 和 false,但不原生识别以前序列化的 't' 和 'f'。 (拉取请求)
使用多参数赋值构造的值现在将使用类型转换后的值在单字段表单输入中呈现。 (提交)
生成模型时不再生成
ApplicationRecord。如果需要生成它,可以使用rails g application_record创建。 (拉取请求)Relation#or现在接受两个references值不同的关系,因为where可以隐式调用references。 (提交)使用
Relation#or时,提取公共条件并将其放在 OR 条件之前。 (拉取请求)添加
binaryfixture 助手方法。 (拉取请求)自动猜测 STI 的反向关联。 (拉取请求)
添加新的错误类
LockWaitTimeout,当锁等待超时时将引发该错误。 (拉取请求)更新
sql.active_record仪表化负载名称,使其更具描述性。 (拉取请求)从数据库中删除索引时使用给定算法。 (拉取请求)
将
Set传递给Relation#where现在与传递数组的行为相同。 (提交)PostgreSQL
tsrange现在保留亚秒精度。 (拉取请求)在脏记录中调用
lock!时引发错误。 (提交)修复了使用 SQLite 适配器时,索引的列顺序未写入
db/schema.rb的错误。 (拉取请求)修复
bin/rails db:migrate与指定VERSION。bin/rails db:migrate与空 VERSION 的行为与不带VERSION相同。检查VERSION的格式:允许迁移版本号或迁移文件名。如果VERSION格式无效,则引发错误。如果目标迁移不存在,则引发错误。 (拉取请求)添加新的错误类
StatementTimeout,当语句超时时将引发该错误。 (拉取请求)update_all现在将将其值传递给Type#cast,然后再传递给Type#serialize。这意味着update_all(foo: 'true')将正确持久化布尔值。 (提交)为数据库迁移添加
#up_only,用于仅在向上迁移时相关的代码,例如填充新列。 (拉取请求)添加新的错误类
QueryCanceled,当因用户请求取消语句时将引发该错误。 (拉取请求)不允许定义与
Relation上的实例方法冲突的作用域。 (拉取请求)为
add_index添加对 PostgreSQL 运算符类的支持。 (拉取请求)重置列信息时,取消定义后代上的属性方法。 (拉取请求)
使用子查询进行
delete_all,带有limit或offset。 (提交)修复了
first(n)与limit()一起使用时不一致的问题。first(n)查找器现在尊重limit(),使其与relation.to_a.first(n)的行为一致,也与last(n)的行为一致。 (拉取请求)修复未持久化父实例上的嵌套
has_many :through关联。 (提交)在通过记录删除时考虑关联条件。 (提交)
在调用
save或save!后不允许破坏的对象发生突变。 (提交)修复
left_outer_joins的关系合并器问题。 (拉取请求)支持 PostgreSQL 外部表。 (拉取请求)
复制 Active Record 对象时清除事务状态。 (拉取请求)
修复当将 Array 对象作为参数传递给使用
composed_of列的 where 方法时未展开的问题。 (拉取请求)使
reflection.klass在polymorphic?不被滥用时引发错误。 (提交)修复 MySQL 和 PostgreSQL 的
#columns_for_distinct,使ActiveRecord::FinderMethods#limited_ids_for使用正确的主键值,即使ORDER BY列包含其他表的主键。 (提交)修复
dependent: :destroy对 has_one/belongs_to 关系的问题,当子类未被删除时,父类被删除。 (提交)空闲数据库连接(以前只是孤立连接)现在由连接池回收器定期回收。 (提交)
9. Active Model
请参阅更改日志了解详细更改。
9.1. 显著变更
修复
ActiveModel::Errors中的#keys、#values方法。更改#keys仅返回没有空消息的键。更改#values仅返回非空值。 (拉取请求)为
ActiveModel::Errors添加#merge!方法。 (拉取请求)允许将 Proc 或 Symbol 传递给长度验证器选项。 (拉取请求)
当
_confirmation的值为false时执行ConfirmationValidator验证。 (拉取请求)使用带 Proc 默认值的属性 API 的模型现在可以被编组。 (提交)
在序列化中不要丢失所有带有选项的多个
:includes。 (提交)
10. Active Support
请参阅更改日志了解详细更改。
10.1. 移除
10.2. 弃用
10.3. 显著变更
为
HashWithIndifferentAccess添加fetch_values。 (拉取请求)为
Time#change添加对:offset的支持。 (提交)为
ActiveSupport::TimeWithZone#change添加对:offset和:zone的支持。 (提交)将 gem 名称和弃用范围传递给弃用通知。 (拉取请求)
添加对版本化缓存条目的支持。这使得缓存存储可以回收缓存键,大大节省了频繁更新情况下的存储。与 Active Record 中
#cache_key和#cache_version的分离及其在 Action Pack 片段缓存中的使用协同工作。 (拉取请求)添加
ActiveSupport::CurrentAttributes以提供线程隔离的属性单例。主要用例是使所有每个请求的属性易于被整个系统访问。 (拉取请求)#singularize和#pluralize现在尊重指定区域设置的不可数名词。 (提交)为
class_attribute添加默认选项。 (拉取请求)添加
Date#prev_occurring和Date#next_occurring以返回指定上一个/下一个发生的星期几。 (拉取请求)为模块和类属性访问器添加默认选项。 (拉取请求)
缓存:
write_multi。 (拉取请求)默认
ActiveSupport::MessageEncryptor使用 AES 256 GCM 加密。 (拉取请求)添加
freeze_time助手,它将测试中的时间冻结到Time.now。 (拉取请求)使
Hash#reverse_merge!的顺序与HashWithIndifferentAccess保持一致。 (拉取请求)为
ActiveSupport::MessageVerifier和ActiveSupport::MessageEncryptor添加目的和过期支持。 (拉取请求)更新
String#camelize以在传递错误选项时提供反馈。 (拉取请求)如果目标为 nil,
Module#delegate_missing_to现在会引发DelegationError,类似于Module#delegate。 (拉取请求)添加
ActiveSupport::EncryptedFile和ActiveSupport::EncryptedConfiguration。 (拉取请求)添加
config/credentials.yml.enc以存储生产应用程序密钥。 (拉取请求)为
MessageEncryptor和MessageVerifier添加密钥轮换支持。 (拉取请求)从
HashWithIndifferentAccess#transform_keys返回HashWithIndifferentAccess的实例。 (拉取请求)如果定义了 Ruby 2.5+ 的内置定义,
Hash#slice现在会回退到它。 (提交)IO#to_json现在返回to_s表示,而不是尝试转换为数组。这修复了在不可读对象上调用IO#to_json时会引发IOError的错误。 (拉取请求)为
Time#prev_day和Time#next_day添加与Date#prev_day、Date#next_day一致的方法签名。允许为Time#prev_day和Time#next_day传递参数。 (提交)为
Time#prev_month和Time#next_month添加与Date#prev_month、Date#next_month一致的方法签名。允许为Time#prev_month和Time#next_month传递参数。 (提交)为
Time#prev_year和Time#next_year添加与Date#prev_year、Date#next_year一致的方法签名。允许为Time#prev_year和Time#next_year传递参数。 (提交)修复
humanize中的首字母缩略词支持。 (提交)允许在 TWZ 范围内使用
Range#include?。 (拉取请求)缓存:默认情况下为大于 1kB 的值启用压缩。 (拉取请求)
处理
TZInfo::AmbiguousTime错误。 (拉取请求)MemCacheStore:支持过期计数器。 (提交)
使
ActiveSupport::TimeZone.all只返回ActiveSupport::TimeZone::MAPPING中存在的时区。 (拉取请求)更改了
ActiveSupport::SecurityUtils.secure_compare的默认行为,使其即使对于变长字符串也不会泄露长度信息。将旧的ActiveSupport::SecurityUtils.secure_compare重命名为fixed_length_secure_compare,并在传递字符串长度不匹配时开始引发ArgumentError。 (拉取请求)assert_changes总是断言表达式发生变化,无论from:和to:参数组合如何。 (拉取请求)在
ActiveSupport::Cache::Store中为read_multi添加缺失的仪表化。 (拉取请求)支持将哈希作为
assert_difference的第一个参数。这允许在同一断言中指定多个数值差异。 (拉取请求)缓存:MemCache 和 Redis
read_multi和fetch_multi加速。在查询后端之前,从本地内存缓存中读取。 (提交)
11. Active Job
请参阅更改日志了解详细更改。
11.1. 显著变化
- 允许将块传递给
ActiveJob::Base.discard_on,以允许自定义处理丢弃的作业。 (拉取请求)
12. Ruby on Rails 指南
请参阅更改日志了解详细更改。
12.1. 显著变化
添加Rails 中的线程和代码执行指南。 (拉取请求)
添加Active Storage 概述指南。 (拉取请求)
13. 鸣谢
请参阅Rails 贡献者完整列表,感谢许多人花费大量时间使 Rails 成为一个稳定而健壮的框架。向他们所有人致敬。