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 版本中通过@dixpac的PR 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
代码执行完毕后,你提供的消息以及代码执行所花费的时间(以毫秒为单位)将被传递给 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_back。redirect_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' }}) %>>
渲染结果:
<div id="percent-loaded" role="progressbar" aria-valuenow="75">
这或许不是最好的例子,但如果哈希值是通过程序生成的,并且需要逻辑运算,那么这可能非常有用。
活动模型
在范围验证中添加数值性
PR 41022,作者:@mpapis
在验证numericality模型属性时,这种新语法允许您为数值验证器指定一个范围,而无需在 ` greater_than_or_equal_toand`less_than_or_equal_to选项之间添加任何内容。
用法示例:
validates :latitude, numericality: { in: -90..90 }
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)
从结果中排除记录
PR 41439,作者:@GlenCrawford
你是否曾经需要一种方法来获取所有符合某个条件的记录,但不包括你已经拥有的记录?excluding这或许正是你需要的。
而不是:
other_users = User.where(rating: 80..).where.not(id: primary_user)
你可以:
other_users = User.where(rating: 80..).excluding(primary_user)
通过 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
您现在可以:
toy.build_toy_box
# <ToyBox:0x00007f572007e170 id: nil, dog_id: 3>
或者:
toy.create_toy_box
# <ToyBox:0x00005601f2ac09a0 id: 5, dog_id: 3>
计算平均值时请考虑列类型
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
采用新行为后,它会遵循数据库列的类型:
Coordinate.calculate(:average, :longitude).class
# Float
Coordinate.calculate(:average, :longitude)
# 130.02356
促成这一改变的原因之一是 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 }
自动加密/解密模型属性
PR 41659,作者:@jorgemanrubia
最后,我们终于到了encrypts。
这值得单独写一篇文章。简单来说,这个功能增加了一种机制,可以ActiveRecord通过encrypts attr_name在模型中声明来自动加密/解密属性。当记录写入数据库时,它会自动加密;当从数据库加载记录时,该属性会自动解密。
encrypts它还提供了一种更改正在使用的加密方案的工作流程,而无需根据新方案重新加密所有先前加密的记录。
数据可以以非确定性的方式加密(对同一文本加密两次会产生不同的密文),也可以以确定性的方式加密——这样就可以查询加密的属性。
其他优点包括能够加密Action Text和过滤应用程序日志文件中的加密属性。
它功能非常强大,并提供了多种自定义行为的方式,具体取决于您的需求。
还有什么?
我刚才提到了一些目前为止最让我兴奋的事情,但还有其他一些很棒的工作正在进行中。特别是ActionPack、ActionView、ActiveRecord和ActiveSupport ,它们的更新列表都在迅速增长。
再次感谢所有为新版本发布做出贡献的人。一切进展顺利!
文章来源:https://dev.to/hint/what-s-cooking-in-rails-7-a42
