发布于 2026-01-06 1 阅读
0

Rails 7 有哪些新功能?Railties、ActionPack、ActionView、ActiveModel、ActiveRecord,还有什么?

Rails 7 有哪些新功能?

铁轨

行动包

操作视图

活动模型

ActiveRecord

还有什么?

Rails 的新版本总是会带来令人兴奋的新功能。本文将带您了解 Rails 7 的一些亮点。

为了找到这些例子,我仔细查阅了变更日志,并根据我目前使用 Rails 的方式,挑选了一些我目前最感兴趣的功能。

我鼓励你也这样做——你可能会发现一些很棒的东西,它会影响你经常使用的功能,或者提供你夜不能寐梦寐以求的功能。

对于每个功能,我都列出了引入该功能的 PR 以及提交该 PR 的 GitHub 用户。

请注意,其中一些功能背后有其他贡献者提交的 PR,他们通过更新文档、添加变更日志、调整实现等方式做出了重要贡献。如果您是其中之一,虽然这里没有明确列出您的贡献,但我们非常感谢您所做的一切!🙏

铁轨

支部

PR 40254,作者:@prateekkish

如果在创建新的 Rails 项目或插件时未指定` --skip-git--branch` 标志,则创建的仓库的默认分支将为 `/var/lib/` 而不是`/var/lib/`。如果您在 Git 配置中设置了不同的分支,则会使用该默认分支。mainmasterinit.defaultBranch

Rails在 5.1 版本中通过@dixpacPR 27632开始初始化 Git 存储库

基准测试任何地方

PR 40734,作者:@semaperepelitsa

此 PR 将该ActiveSupport::Benchmarkable.benchmark方法添加到命名空间,这样您就可以轻松地对任何代码块进行基准测试Rails而无需logger声明模块extendincludeActiveSupport::Benchmarkable

要使用这项新功能,你可以这样做:

  Rails.benchmark('Print bar') do
    # code to benchmark
    100.times { puts 'bar' }
  end
Enter fullscreen mode Exit fullscreen mode

代码执行完毕后,你提供的消息以及代码执行所花费的时间(以毫秒为单位)将被传递给 Rails 日志记录器,即:Print bar (0.6ms)。该benchmark调用将返回代码块的返回值,100在本例中为。

样式表和ERB视图的支持统计

PR 40597,作者:@joelhawksley

如果您运行过该命令rails stats,您就会知道它会提供有关应用程序代码库的各种统计信息。这项新功能在输出中添加了 `/etc/applications/config/files` 和 `/etc/applications/config/files`,分别提供 `/etc/applications/config/files` 和 `/etc/applications/config/files` 中文件的Views统计信息Stylesheetsapp/viewsapp/assets/stylesheets

请注意,样式表需要具有 .stylesheet.css.scss.view 扩展名,视图文件需要具有.erb.view 扩展名才能被处理。

行动包

返回或跳转

PR 40671,作者:@dhh

可以redirect_back_or_to(fallback, **)作为……的简写redirect_back(fallback_location:, **)

这样就避免了必须fallback_location向其指定 kwarg(关键字参数)redirect_backredirect_back_or_to如果可以,它会将用户重定向回他们来的地方;如果不能,则会重定向到备用位置。

旧语法仍然有效,并且没有被明确弃用,但现在底层redirect_back调用的是新语法redirect_back_or_to

未经授权的参数上下文

PR 41809,作者:@bbuchalter

此 PR 在初始化参数对象时提供控制器和请求上下文,以便在记录不允许的属性时,也会记录控制器、操作、请求和过滤后的参数。

操作视图

图片延迟加载

PR 38452,作者:@jonathanhefner

目前,应用程序可以通过在 `<head>` 函数调用中手动指定 `images`loading属性来利用 HTML 标准的延迟加载功能。这项新配置允许您将默认值设置为应用程序范围,这样您只需在需要预先加载图像的地方指定该属性即可。lazyimage_tag"lazy"

一只积极的海狸

从哈希值标记属性

PR 40657,作者:@seanpdoyle

这个很棒的新增功能提供了一种巧妙的方法,可以将属性哈希转换为 ERB 标签上的属性。

例如:

<div <%= tag.attributes({ id: 'percent-loaded', role: 'progressbar', aria: { valuenow: '75' }}) %>>
Enter fullscreen mode Exit fullscreen mode

渲染结果:

<div id="percent-loaded" role="progressbar" aria-valuenow="75">
Enter fullscreen mode Exit fullscreen mode

这或许不是最好的例子,但如果哈希值是通过程序生成的,并且需要逻辑运算,那么这可能非常有用。

活动模型

在范围验证中添加数值性

PR 41022,作者:@mpapis

在验证numericality模型属性时,这种新语法允许您为数值验证器指定一个范围,而无需在 ` greater_than_or_equal_toand`less_than_or_equal_to选项之间添加任何内容。

用法示例:

validates :latitude, numericality: { in: -90..90 }
Enter fullscreen mode Exit fullscreen mode

ActiveRecord

反转where子句

PR 40249,作者:@kddeisz

新增的这个功能提供了一种便捷的方法来获取 where 子句的逆向逻辑invert_where

例如:

good_students = Student.where(grade: 80..100)
# SELECT \"students\".* FROM \"students\" WHERE \"students\".\"grade\" BETWEEN 80 AND 100

bad_students = good_students.invert_where
# SELECT \"students\".* FROM \"students\" WHERE NOT (\"students\".\"grade\" BETWEEN 80 AND 100)
Enter fullscreen mode Exit fullscreen mode

从结果中排除记录

PR 41439,作者:@GlenCrawford

你是否曾经需要一种方法来获取所有符合某个条件的记录,但不包括你已经拥有的记录?excluding这或许正是你需要的。

而不是:

other_users = User.where(rating: 80..).where.not(id: primary_user)
Enter fullscreen mode Exit fullscreen mode

你可以:

other_users = User.where(rating: 80..).excluding(primary_user)
Enter fullscreen mode Exit fullscreen mode

通过 Has One 建立或创建关联

PR 40007,作者:@perezperret

为关联关系启用“build_association与”功能。此前,这些功能在关联关系中不可用create_associationhas_one through:through

例如,如果你有:

class Dog
  has_many :toys
  has_one :toy_box
end

class Toy
  belongs_to :dog
  has_one :toy_box, through: :dog
end

class ToyBox
  belongs_to :dog
end
Enter fullscreen mode Exit fullscreen mode

您现在可以:

toy.build_toy_box
# <ToyBox:0x00007f572007e170 id: nil, dog_id: 3>
Enter fullscreen mode Exit fullscreen mode

或者:

toy.create_toy_box
# <ToyBox:0x00005601f2ac09a0 id: 5, dog_id: 3>
Enter fullscreen mode Exit fullscreen mode

计算平均值时请考虑列类型

PR 40351,作者:@schmijos

在 Rails 的早期版本中,即使列是或类型,ActiveRecord::Caculations#calculate调用:average也会导致BigDecimalFloatInteger

例如:

Coordinate.last.longitude.class
# Float
Coordinate.calculate(:average, :longitude).class
# BigDecimal
Coordinate.calculate(:average, :longitude)
# 0.13002356e3
Enter fullscreen mode Exit fullscreen mode

采用新行为后,它会遵循数据库列的类型:

Coordinate.calculate(:average, :longitude).class
# Float
Coordinate.calculate(:average, :longitude)
# 130.02356
Enter fullscreen mode Exit fullscreen mode

促成这一改变的原因之一是 JSON 转换的BigDecimal结果是一个字符串值,而Float的结果是一个数值。

JSON.parse({ avg_longitude: 130.02356.to_d }.to_json)
# { "avg_longitude" => "130.02356" }
JSON.parse({ avg_longitude: 130.02356 }.to_json)
# { "avg_longitude" => 130.02356 }
Enter fullscreen mode Exit fullscreen mode

自动加密/解密模型属性

PR 41659,作者:@jorgemanrubia

最后,我们终于到了encrypts

这值得单独写一篇文章。简单来说,这个功能增加了一种机制,可以ActiveRecord通过encrypts attr_name在模型中声明来自动加密/解密属性。当记录写入数据库时​​,它会自动加密;当从数据库加载记录时,该属性会自动解密。

encrypts它还提供了一种更改正在使用的加密方案的工作流程,而无需根据新方案重新加密所有先前加密的记录。

数据可以以非确定性的方式加密(对同一文本加密两次会产生不同的密文),也可以以确定性的方式加密——这样就可以查询加密的属性。

其他优点包括能够加密Action Text和过滤应用程序日志文件中的加密属性。

它功能非常强大,并提供了多种自定义行为的方式,具体取决于您的需求。

还有什么?

我刚才提到了一些目前为止最让我兴奋的事情,但还有其他一些很棒的工作正在进行中。特别是ActionPackActionViewActiveRecordActiveSupport ,它们的更新列表都在迅速增长。

再次感谢所有为新版本发布做出贡献的人。一切进展顺利!

文章来源:https://dev.to/hint/what-s-cooking-in-rails-7-a42