更多内容请访问 rubyonrails.org:

Ruby on Rails 5.2 发行说明

Rails 5.2 中的亮点

  • Active Storage
  • Redis 缓存存储
  • HTTP/2 Early Hints
  • 凭据
  • 内容安全策略

这些发行说明仅涵盖主要更改。要了解各种错误修复和更改,请参阅更改日志或查看 GitHub 上主 Rails 仓库中的提交列表

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 dbconsolerails 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。 (提交)

  • 运行 consoledbconsole 命令时,正确展开环境名称的快捷方式。 (提交)

  • bootsnap 添加到默认 Gemfile。 (拉取请求)

  • 支持 - 作为与平台无关的方式,通过 rails runner 从标准输入运行脚本 (拉取请求)

  • 在创建新的 Rails 应用程序时,将 ruby x.x.x 版本添加到 Gemfile 并创建包含当前 Ruby 版本的 .ruby-version 根文件。 (拉取请求)

  • --skip-action-cable 选项添加到插件生成器。 (拉取请求)

  • 为插件生成器添加 git_sourceGemfile。 (拉取请求)

  • 在 Rails 插件中运行 bin/rails 时跳过未使用的组件。 (提交)

  • 优化生成器操作的缩进。 (拉取请求)

  • 优化路由缩进。 (拉取请求)

  • --skip-yarn 选项添加到插件生成器。 (拉取请求)

  • 支持生成器 gem 方法的多个版本参数。 (拉取请求)

  • 在开发和测试环境中,从应用程序名称派生 secret_key_base。 (拉取请求)

  • mini_magick 作为注释添加到默认 Gemfile。 (拉取请求)

  • rails newrails plugin new 默认获取 Active Storage。添加跳过 Active Storage 的功能,使用 --skip-active-storage,并在使用 --skip-active-record 时自动跳过。 (拉取请求)

4. Action Cable

请参阅更改日志了解详细更改。

4.1. 移除

  • 删除了已弃用的 evented redis 适配器。 (提交)

4.2. 显著变化

  • 在 cable.yml 中添加对 hostportdbpassword 选项的支持 (拉取请求)

  • 使用 PostgreSQL 适配器时,哈希长流标识符。 (拉取请求)

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 遍历已挂载的引擎。 (拉取请求)

  • 添加用于配置内容安全策略标头的 DSL。 (拉取请求, 提交, 提交)

  • 注册现代浏览器支持的最流行的音频/视频/字体 MIME 类型。 (拉取请求)

  • 将默认系统测试屏幕截图输出从 inline 更改为 simple。 (提交)

  • 为系统测试添加无头 Firefox 支持。 (拉取请求)

  • 在默认标头集中添加安全的 X-Download-OptionsX-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_hashto_h。为 session 添加别名方法 to_hto_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. 显著变化

  • 允许 Action Mailer 类配置其投递作业。 (拉取请求)

  • 添加 assert_enqueued_email_with 测试助手。 (拉取请求)

8. Active Record

请参阅更改日志了解详细更改。

8.1. 移除

  • 删除已弃用的 #migration_keys。 (拉取请求)

  • 删除已弃用的 quoted_id 支持,当对 Active Record 对象进行类型转换时。 (提交)

  • 删除 index_name_exists? 中已弃用的参数 default。 (提交)

  • 删除关联中向 :class_name 传递类名的已弃用支持。 (提交)

  • 删除已弃用的方法 initialize_schema_migrations_tableinitialize_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 中同时向 countsum 传递参数和块。 (拉取请求)

  • 弃用 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_eachfind_in_batchesin_batches)时跳过查询缓存。 (提交)

  • 将 sqlite3 布尔值序列化更改为使用 1 和 0。SQLite 原生识别 1 和 0 为 true 和 false,但不原生识别以前序列化的 't' 和 'f'。 (拉取请求)

  • 使用多参数赋值构造的值现在将使用类型转换后的值在单字段表单输入中呈现。 (提交)

  • 生成模型时不再生成 ApplicationRecord。如果需要生成它,可以使用 rails g application_record 创建。 (拉取请求)

  • Relation#or 现在接受两个 references 值不同的关系,因为 where 可以隐式调用 references。 (提交)

  • 使用 Relation#or 时,提取公共条件并将其放在 OR 条件之前。 (拉取请求)

  • 添加 binary fixture 助手方法。 (拉取请求)

  • 自动猜测 STI 的反向关联。 (拉取请求)

  • 添加新的错误类 LockWaitTimeout,当锁等待超时时将引发该错误。 (拉取请求)

  • 更新 sql.active_record 仪表化负载名称,使其更具描述性。 (拉取请求)

  • 从数据库中删除索引时使用给定算法。 (拉取请求)

  • Set 传递给 Relation#where 现在与传递数组的行为相同。 (提交)

  • PostgreSQL tsrange 现在保留亚秒精度。 (拉取请求)

  • 在脏记录中调用 lock! 时引发错误。 (提交)

  • 修复了使用 SQLite 适配器时,索引的列顺序未写入 db/schema.rb 的错误。 (拉取请求)

  • 修复 bin/rails db:migrate 与指定 VERSIONbin/rails db:migrate 与空 VERSION 的行为与不带 VERSION 相同。检查 VERSION 的格式:允许迁移版本号或迁移文件名。如果 VERSION 格式无效,则引发错误。如果目标迁移不存在,则引发错误。 (拉取请求)

  • 添加新的错误类 StatementTimeout,当语句超时时将引发该错误。 (拉取请求)

  • update_all 现在将将其值传递给 Type#cast,然后再传递给 Type#serialize。这意味着 update_all(foo: 'true') 将正确持久化布尔值。 (提交)

  • 要求在关系查询方法中使用原始 SQL 片段时明确标记。 (提交, 提交)

  • 为数据库迁移添加 #up_only,用于仅在向上迁移时相关的代码,例如填充新列。 (拉取请求)

  • 添加新的错误类 QueryCanceled,当因用户请求取消语句时将引发该错误。 (拉取请求)

  • 不允许定义与 Relation 上的实例方法冲突的作用域。 (拉取请求)

  • add_index 添加对 PostgreSQL 运算符类的支持。 (拉取请求)

  • 记录数据库查询调用者。 (拉取请求, 拉取请求, 拉取请求)

  • 重置列信息时,取消定义后代上的属性方法。 (拉取请求)

  • 使用子查询进行 delete_all,带有 limitoffset。 (提交)

  • 修复了 first(n)limit() 一起使用时不一致的问题。first(n) 查找器现在尊重 limit(),使其与 relation.to_a.first(n) 的行为一致,也与 last(n) 的行为一致。 (拉取请求)

  • 修复未持久化父实例上的嵌套 has_many :through 关联。 (提交)

  • 在通过记录删除时考虑关联条件。 (提交)

  • 在调用 savesave! 后不允许破坏的对象发生突变。 (提交)

  • 修复 left_outer_joins 的关系合并器问题。 (拉取请求)

  • 支持 PostgreSQL 外部表。 (拉取请求)

  • 复制 Active Record 对象时清除事务状态。 (拉取请求)

  • 修复当将 Array 对象作为参数传递给使用 composed_of 列的 where 方法时未展开的问题。 (拉取请求)

  • 使 reflection.klasspolymorphic? 不被滥用时引发错误。 (提交)

  • 修复 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. 移除

  • 删除回调中已弃用的 :if:unless 字符串过滤器。 (提交)

  • 删除已弃用的 halt_callback_chains_on_return_false 选项。 (提交)

10.2. 弃用

  • 弃用 Module#reachable? 方法。 (拉取请求)

  • 弃用 secrets.secret_token。 (提交)

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_occurringDate#next_occurring 以返回指定上一个/下一个发生的星期几。 (拉取请求)

  • 为模块和类属性访问器添加默认选项。 (拉取请求)

  • 缓存:write_multi。 (拉取请求)

  • 默认 ActiveSupport::MessageEncryptor 使用 AES 256 GCM 加密。 (拉取请求)

  • 添加 freeze_time 助手,它将测试中的时间冻结到 Time.now。 (拉取请求)

  • 使 Hash#reverse_merge! 的顺序与 HashWithIndifferentAccess 保持一致。 (拉取请求)

  • ActiveSupport::MessageVerifierActiveSupport::MessageEncryptor 添加目的和过期支持。 (拉取请求)

  • 更新 String#camelize 以在传递错误选项时提供反馈。 (拉取请求)

  • 如果目标为 nil,Module#delegate_missing_to 现在会引发 DelegationError,类似于 Module#delegate。 (拉取请求)

  • 添加 ActiveSupport::EncryptedFileActiveSupport::EncryptedConfiguration。 (拉取请求)

  • 添加 config/credentials.yml.enc 以存储生产应用程序密钥。 (拉取请求)

  • MessageEncryptorMessageVerifier 添加密钥轮换支持。 (拉取请求)

  • HashWithIndifferentAccess#transform_keys 返回 HashWithIndifferentAccess 的实例。 (拉取请求)

  • 如果定义了 Ruby 2.5+ 的内置定义,Hash#slice 现在会回退到它。 (提交)

  • IO#to_json 现在返回 to_s 表示,而不是尝试转换为数组。这修复了在不可读对象上调用 IO#to_json 时会引发 IOError 的错误。 (拉取请求)

  • Time#prev_dayTime#next_day 添加与 Date#prev_dayDate#next_day 一致的方法签名。允许为 Time#prev_dayTime#next_day 传递参数。 (提交)

  • Time#prev_monthTime#next_month 添加与 Date#prev_monthDate#next_month 一致的方法签名。允许为 Time#prev_monthTime#next_month 传递参数。 (提交)

  • Time#prev_yearTime#next_year 添加与 Date#prev_yearDate#next_year 一致的方法签名。允许为 Time#prev_yearTime#next_year 传递参数。 (提交)

  • 修复 humanize 中的首字母缩略词支持。 (提交)

  • 允许在 TWZ 范围内使用 Range#include?。 (拉取请求)

  • 缓存:默认情况下为大于 1kB 的值启用压缩。 (拉取请求)

  • Redis 缓存存储。 (拉取请求, 拉取请求)

  • 处理 TZInfo::AmbiguousTime 错误。 (拉取请求)

  • MemCacheStore:支持过期计数器。 (提交)

  • 使 ActiveSupport::TimeZone.all 只返回 ActiveSupport::TimeZone::MAPPING 中存在的时区。 (拉取请求)

  • 更改了 ActiveSupport::SecurityUtils.secure_compare 的默认行为,使其即使对于变长字符串也不会泄露长度信息。将旧的 ActiveSupport::SecurityUtils.secure_compare 重命名为 fixed_length_secure_compare,并在传递字符串长度不匹配时开始引发 ArgumentError。 (拉取请求)

  • 使用 SHA-1 生成非敏感摘要,例如 ETag 标头。 (拉取请求, 拉取请求)

  • assert_changes 总是断言表达式发生变化,无论 from:to: 参数组合如何。 (拉取请求)

  • ActiveSupport::Cache::Store 中为 read_multi 添加缺失的仪表化。 (拉取请求)

  • 支持将哈希作为 assert_difference 的第一个参数。这允许在同一断言中指定多个数值差异。 (拉取请求)

  • 缓存:MemCache 和 Redis read_multifetch_multi 加速。在查询后端之前,从本地内存缓存中读取。 (提交)

11. Active Job

请参阅更改日志了解详细更改。

11.1. 显著变化

  • 允许将块传递给 ActiveJob::Base.discard_on,以允许自定义处理丢弃的作业。 (拉取请求)

12. Ruby on Rails 指南

请参阅更改日志了解详细更改。

12.1. 显著变化

13. 鸣谢

请参阅Rails 贡献者完整列表,感谢许多人花费大量时间使 Rails 成为一个稳定而健壮的框架。向他们所有人致敬。



回到顶部