edge
更多信息请访问 rubyonrails.org: 更多 Ruby on Rails

Ruby on Rails 5.2 发布说明

Rails 5.2 的亮点:

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

1 升级到 Rails 5.2

如果您正在升级现有应用程序,在进行升级之前,最好有良好的测试覆盖率。您还应该先升级到 Rails 5.1(如果尚未升级),并确保您的应用程序在尝试更新到 Rails 5.2 之前仍然按预期运行。在升级时要注意的事项列表可在升级 Ruby on Rails指南中找到。

2 主要特性

2.1 Active Storage

Pull Request

Active Storage 用于将文件上传到云存储服务,如 Amazon S3、Google Cloud Storage 或 Microsoft Azure Storage,并将这些文件附加到 Active Record 对象。它配备了一个基于本地磁盘的服务,用于开发和测试,并支持将文件镜像到从属服务以进行备份和迁移。您可以在Active Storage 概述指南中了解更多关于 Active Storage 的信息。

2.2 Redis Cache Store

Pull Request

Rails 5.2 预装了内置的 Redis 缓存存储。您可以在Caching with Rails: An Overview指南中了解更多信息。

2.3 HTTP/2 Early Hints

Pull Request

Rails 5.2 支持 HTTP/2 Early Hints。要启用 Early Hints,可以在 bin/rails server 中传递 --early-hints

2.4 Credentials

Pull Request

添加了 config/credentials.yml.enc 文件来存储生产应用程序的秘密。它允许直接在存储库中使用 config/master.key 文件或 RAILS_MASTER_KEY 环境变量加密的密钥保存任何第三方服务的身份验证凭据。这将最终取代 Rails.application.secrets 和 Rails 5.1 中引入的加密秘密。此外,Rails 5.2 还开放了底层 Credentials 的 API,因此您可以轻松处理其他加密配置、密钥和文件。您可以在Securing Rails Applications指南中了解更多信息。

2.5 内容安全策略

Rails 5.2的拉取请求

Rails 5.2引入了一个新的DSL,允许您为应用程序配置内容安全策略。您可以配置一个全局默认策略,然后根据每个资源进行覆盖,并且甚至可以使用lambda函数将每个请求的值注入到标头中,例如在多租户应用程序中的帐户子域。您可以在Securing Rails Applications指南中了解更多信息。

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命令时环境名称的快捷方式。 (提交)

  • 在默认的Gemfile中添加bootsnap。 (拉取请求)

  • 使用rails runner支持-作为从stdin运行脚本的平台无关方式。 (拉取请求)

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

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

  • 在插件生成器的Gemfile中添加git_source。 (Pull Request)

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

  • 优化生成器操作的缩进。 (Pull Request)

  • 优化路由的缩进。 (Pull Request)

  • 在插件生成器中添加--skip-yarn选项。 (Pull Request)

  • 为生成器的gem方法支持多个版本参数。 (Pull Request)

  • 在开发和测试环境中根据应用程序名称派生secret_key_base。 (Pull Request)

  • mini_magick作为注释添加到默认的Gemfile中。 (Pull Request)

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

4 Action Cable

详细更改请参考Changelog

4.1 移除

  • 移除已弃用的事件驱动的Redis适配器。 (Commit)

4.2 重要更改

  • 在cable.yml中添加对hostportdbpassword选项的支持。 (Pull Request)

  • 在使用PostgreSQL适配器时对长流标识进行哈希处理。 (Pull Request)

5 Action Pack

详细更改请参考Changelog

5.1 移除

  • 移除已弃用的ActionController::ParamsParser::ParseError。 (Commit)

5.2 弃用

  • 弃用ActionDispatch::TestResponse#success?#missing?#error?别名。 (Pull Request)

5.3 重要更改

  • 使用片段缓存支持可回收的缓存键。 (Pull Request)

  • 更改片段的缓存键格式,以便更容易调试键的变化。 (Pull Request)

  • 使用GCM进行AEAD加密的Cookie和会话。 (Pull Request)

  • 默认启用防止伪造。 (Pull Request)

  • 在服务器端强制签名/加密Cookie的过期时间。 (Pull Request)

  • Cookies的:expires选项支持ActiveSupport::Duration对象。 (Pull Request)

  • 使用Capybara注册的:puma服务器配置。 (Pull Request)

  • 简化带有密钥轮换支持的Cookies中间件。 (Pull Request)

  • 添加启用HTTP/2的Early Hints功能。 (Pull Request)

  • 在系统测试中添加无头Chrome支持。 (Pull Request)

  • redirect_back方法中添加:allow_other_host选项。 (Pull Request)

  • 使assert_recognizes能够遍历已挂载的引擎。 (Pull Request)

  • 添加用于配置Content-Security-Policy头的DSL。 (Pull Request, Commit, Commit)

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

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

  • 为系统测试添加无头Firefox支持。 (Pull Request)

  • 将安全的X-Download-OptionsX-Permitted-Cross-Domain-Policies添加到默认头集合中。 (Commit)

  • 当用户没有手动指定其他服务器时,将系统测试更改为仅将Puma设置为默认服务器。 (Pull Request)

  • Referrer-Policy头添加到默认头集合中。 (Commit)

  • ActionController::Parameters#each中匹配Hash#each的行为。 (Pull Request)

  • 为Rails UJS添加自动生成nonce的支持。 (Commit)

  • 将默认的HSTS max-age值更新为31536000秒(1年),以满足https://hstspreload.org/的最小max-age要求。 (Commit)

  • cookies添加别名方法to_hash。 为session添加别名方法to_h。 (Commit)

6 Action View

请参阅Changelog以获取详细更改信息。

6.1 删除

  • 删除已弃用的Erubis ERB处理程序。 (Commit)

6.2 弃用

  • 弃用image_alt助手,该助手用于为image_tag生成的图像添加默认的alt文本。 (Pull Request)

6.3 显著更改

  • auto_discovery_link_tag添加:json类型,以支持JSON Feeds。 (Pull Request)

  • image_tag助手添加srcset选项。 (Pull Request)

  • 修复field_error_proc包装optgroup和选择分隔符option的问题。 (Pull Request)

  • form_with更改为默认生成id。 (Commit)

  • 添加preload_link_tag助手。 (Pull Request)

  • 允许使用可调用对象作为分组选择器的组方法。 (Pull Request)

7 Action Mailer

请参阅Changelog以获取详细更改信息。

7.1 显著更改

  • 允许Action Mailer类配置其传递作业。 (Pull Request)

  • 添加assert_enqueued_email_with测试助手。 (Pull Request)

8 Active Record

请参考Changelog以获取详细的更改信息。

8.1 移除

  • 移除已弃用的#migration_keys。 (Pull Request)

  • 移除在类型转换Active Record对象时已弃用的对quoted_id的支持。 (Commit)

  • 移除index_name_exists?中已弃用的default参数。 (Commit)

  • 移除在关联中传递类到:class_name时已弃用的支持。 (Commit)

  • 移除已弃用的方法initialize_schema_migrations_tableinitialize_internal_metadata_table。 (Commit)

  • 移除已弃用的方法supports_migrations?。 (Commit)

  • 移除已弃用的方法supports_primary_key?。 (Commit)

  • 移除已弃用的方法ActiveRecord::Migrator.schema_migrations_table_name。 (Commit)

  • 移除#indexes中已弃用的参数name。 (Commit)

  • 移除#verify!中已弃用的参数。 (Commit)

  • 移除已弃用的配置.error_on_ignored_order_or_limit。 (Commit)

  • 移除已弃用的方法#scope_chain。 (Commit)

  • 移除已弃用的方法#sanitize_conditions。 (Commit)

8.2 弃用

  • 弃用supports_statement_cache?。 (Pull Request)

  • 弃用同时传递参数和块到ActiveRecord::Calculations中的countsum。 (Pull Request)

  • 弃用在Relation中委托给arel。 (Pull Request)

  • 弃用TransactionState中的set_state方法。 (Commit)

  • 弃用expand_hash_conditions_for_aggregates,没有替代方法。 (Commit)

8.3 显著更改

  • 当调用动态fixture访问器方法时没有参数,现在返回该类型的所有fixtures。之前该方法总是返回一个空数组。 (Pull Request)

  • 修复在覆盖Active Record属性读取器时的更改属性的不一致性。 (Pull Request)

  • 支持MySQL的降序索引。 (Pull Request)

  • 修复bin/rails db:forward的第一个迁移。 (Commit)

  • 当当前迁移不存在时,在迁移的移动上引发UnknownMigrationVersionError错误。 (Commit)

  • 在数据库结构转储的rake任务中,遵循SchemaDumper.ignore_tables。 (Pull Request)

  • 添加ActiveRecord::Base#cache_version以支持通过ActiveSupport::Cache中的新版本化条目的可回收缓存键。这也意味着ActiveRecord::Base#cache_key现在将返回一个稳定的键,不再包含时间戳。 (Pull Request)

  • 如果转换后的值为nil,则防止创建绑定参数。 (Pull Request)

  • 使用批量INSERT来插入fixtures以提高性能。 (Pull Request)

  • 合并表示嵌套连接的两个关系不再将合并后的关系的连接转换为左外连接。 (拉取请求)

  • 修复事务以将状态应用于子事务。 以前,如果您有一个嵌套事务并且外部事务被回滚,内部事务的记录仍将被标记为已持久化。通过在父事务回滚时将父事务的状态应用于子事务来修复此问题。这将正确地将内部事务的记录标记为未持久化。 (提交)

  • 修复使用包括连接的范围进行急切加载/预加载关联。 (拉取请求)

  • 防止由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值不同,因为references可以由where隐式调用。 (提交)

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

  • 添加binary夹具辅助方法。 (拉取请求)

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

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

  • 更新sql.active_record仪表化的有效负载名称以更具描述性。 (拉取请求)

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

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

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

  • 在脏记录中调用lock!时会引发异常。 (提交记录)

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

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

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

  • update_all现在在将值传递给Type#serialize之前会将其传递给Type#cast。这意味着update_all(foo: 'true')将正确地持久化布尔值。 (提交记录)

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

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

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

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

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

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

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

  • 使用子查询进行带有limitoffsetdelete_all。 (提交记录)

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

  • 修复了在未持久化的父实例上使用嵌套的has_many :through关联的问题。 (提交记录)

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

  • 在调用savesave!后不允许修改已销毁的对象。 (提交记录)

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

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

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

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

  • polymorphic?未被误用时,使reflection.klass抛出异常。 (提交记录)

  • 修复MySQL和PostgreSQL的#columns_for_distinct,使ActiveRecord::FinderMethods#limited_ids_forORDER BY列包含其他表的主键时使用正确的主键值。 (提交记录)

  • 修复has_one/belongs_to关系中dependent: :destroy的问题,当子对象未被删除时父对象被删除。 (提交记录)

  • 空闲的数据库连接(之前只是孤立的连接)现在会被连接池清理器定期清理。 (提交记录)

9 Active Model

详细更改请参阅Changelog

9.1 显著更改

  • 修复ActiveModel::Errors中的#keys#values方法。将#keys改为仅返回没有空消息的键。将#values改为仅返回非空值。 (拉取请求)

  • ActiveModel::Errors添加#merge!方法。 (拉取请求)

  • 允许将Proc或Symbol传递给长度验证器选项。 (拉取请求)

  • _confirmation的值为false时执行ConfirmationValidator验证。 (拉取请求)

  • 使用带有proc默认值的属性API的模型现在可以被序列化。 (提交记录)

  • 在序列化中不丢失所有带有选项的多个:includes。 (提交记录)

10 Active Support

详细更改请参阅Changelog

10.1 移除

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

  • 移除已弃用的halt_callback_chains_on_return_false选项。 (提交记录)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 根据Date#prev_dayDate#next_day的要求,为Time#prev_dayTime#next_day添加相同的方法签名。允许传递参数给Time#prev_dayTime#next_day。 (提交记录)

  • 根据Date#prev_monthDate#next_month的要求,为Time#prev_monthTime#next_month添加相同的方法签名。允许传递参数给Time#prev_monthTime#next_month。 (提交记录)

  • 根据Date#prev_yearDate#next_year的要求,为Time#prev_yearTime#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付出了大量时间的人,使其成为一个稳定而强大的框架。

反馈

欢迎您帮助改进本指南的质量。

如果您发现任何拼写错误或事实错误,请贡献您的意见。 要开始,请阅读我们的 文档贡献 部分。

您还可能会发现不完整的内容或过时的内容。 请为主要内容添加任何缺失的文档。请先检查 Edge 指南,以验证问题是否已经修复或尚未修复。 请参阅 Ruby on Rails 指南准则 以了解样式和规范。

如果您发现需要修复但无法自行修复的问题,请 提交问题

最后但同样重要的是,欢迎您在 官方 Ruby on Rails 论坛 上讨论有关 Ruby on Rails 文档的任何问题。