1 升级到 Rails 5.2
如果您正在升级现有应用程序,在进行升级之前,最好有良好的测试覆盖率。您还应该先升级到 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 Cache Store
Rails 5.2 预装了内置的 Redis 缓存存储。您可以在Caching with Rails: An Overview指南中了解更多信息。
2.3 HTTP/2 Early Hints
Rails 5.2 支持 HTTP/2 Early Hints。要启用 Early Hints,可以在 bin/rails server
中传递 --early-hints
。
2.4 Credentials
添加了 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引入了一个新的DSL,允许您为应用程序配置内容安全策略。您可以配置一个全局默认策略,然后根据每个资源进行覆盖,并且甚至可以使用lambda函数将每个请求的值注入到标头中,例如在多租户应用程序中的帐户子域。您可以在Securing Rails Applications指南中了解更多信息。
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
命令时环境名称的快捷方式。 (提交)在默认的
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 new
和rails 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中添加对
host
、port
、db
和password
选项的支持。 (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-Options
和X-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_table
和initialize_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
中的count
和sum
。 (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_each
,find_in_batches
,in_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')
将正确地持久化布尔值。 (提交记录)为仅在迁移上时相关的代码添加
#up_only
到数据库迁移中,例如填充新列。 (拉取请求)添加新的错误类
QueryCanceled
,当取消语句由于用户请求时将引发该错误。 (拉取请求)不允许定义与
Relation
上的实例方法冲突的作用域。 (拉取请求)为
add_index
添加对PostgreSQL操作符类的支持。 (拉取请求)在重置列信息时,取消定义后代的属性方法。 (拉取请求)
使用子查询进行带有
limit
或offset
的delete_all
。 (提交记录)修复了在与
limit()
一起使用时first(n)
的不一致性。first(n)
查找器现在尊重limit()
,使其与relation.to_a.first(n)
的行为一致,也与last(n)
的行为一致。 (拉取请求)修复了在未持久化的父实例上使用嵌套的
has_many :through
关联的问题。 (提交记录)在删除记录时考虑关联条件。 (提交记录)
在调用
save
或save!
后不允许修改已销毁的对象。 (提交记录)修复
left_outer_joins
中的关联合并问题。 (拉取请求)支持PostgreSQL外部表。 (拉取请求)
当复制一个Active Record对象时清除事务状态。 (拉取请求)
修复使用
composed_of
列将Array对象作为参数传递给where方法时未展开的问题。 (拉取请求)当
polymorphic?
未被误用时,使reflection.klass
抛出异常。 (提交记录)修复MySQL和PostgreSQL的
#columns_for_distinct
,使ActiveRecord::FinderMethods#limited_ids_for
在ORDER 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 移除
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
。 (拉取请求)默认使用AES 256 GCM加密的
ActiveSupport::MessageEncryptor
。 (拉取请求)添加
freeze_time
助手,在测试中将时间冻结为Time.now
。 (拉取请求)使
Hash#reverse_merge!
的顺序与HashWithIndifferentAccess
一致。 (拉取请求)为
ActiveSupport::MessageVerifier
和ActiveSupport::MessageEncryptor
添加目的和过期支持。 (拉取请求)更新
String#camelize
以在传递错误选项时提供反馈。 (拉取请求)如果目标为nil,
Module#delegate_missing_to
现在会像Module#delegate
一样引发DelegationError
。 (拉取请求)添加
ActiveSupport::EncryptedFile
和ActiveSupport::EncryptedConfiguration
。 (拉取请求)添加
config/credentials.yml.enc
以存储生产应用程序的秘密。 (拉取请求)为
MessageEncryptor
和MessageVerifier
添加密钥轮换支持。 (拉取请求)从
HashWithIndifferentAccess#transform_keys
返回HashWithIndifferentAccess
的实例。 (拉取请求)如果定义了,
Hash#slice
现在会回退到Ruby 2.5+的内置定义。 (提交记录)IO#to_json
现在返回to_s
的表示形式,而不是尝试转换为数组。这修复了在调用不可读对象的IO#to_json
时引发IOError
的错误。 (拉取请求)根据
Date#prev_day
和Date#next_day
的要求,为Time#prev_day
和Time#next_day
添加相同的方法签名。允许传递参数给Time#prev_day
和Time#next_day
。 (提交记录)根据
Date#prev_month
和Date#next_month
的要求,为Time#prev_month
和Time#next_month
添加相同的方法签名。允许传递参数给Time#prev_month
和Time#next_month
。 (提交记录)根据
Date#prev_year
和Date#next_year
的要求,为Time#prev_year
和Time#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付出了大量时间的人,使其成为一个稳定而强大的框架。
反馈
欢迎您帮助改进本指南的质量。
如果您发现任何拼写错误或事实错误,请贡献您的意见。 要开始,请阅读我们的 文档贡献 部分。
您还可能会发现不完整的内容或过时的内容。 请为主要内容添加任何缺失的文档。请先检查 Edge 指南,以验证问题是否已经修复或尚未修复。 请参阅 Ruby on Rails 指南准则 以了解样式和规范。
如果您发现需要修复但无法自行修复的问题,请 提交问题。
最后但同样重要的是,欢迎您在 官方 Ruby on Rails 论坛 上讨论有关 Ruby on Rails 文档的任何问题。