gpt4 book ai didi

ruby-on-rails - 有什么用!在 rails 上

转载 作者:行者123 更新时间:2023-12-04 05:45:13 27 4
gpt4 key购买 nike

!有什么用在 rails 上?

特别是在这一行:来自 HArtl 教程

users = User.order(:created_at).take(6)
50.times do
content = Faker::Lorem.sentence(5)
user.each { |user| user.microposts.create!( content: content )}
end

基本上这是为 6 个用户创建推文/微博。

我真的想知道为什么需要使用 !

最佳答案

要记住的重要一点是,在 Ruby 中,尾随 !?允许在方法名称上并成为方法名称的一部分,而不是添加的修饰符。 xx!x?是三种完全不同的方法。

在 Ruby 中,约定是添加 !进行就地修改的方法,即它们以基本方式修改对象。一个例子是 String#gsub它返回一个副本,和 String#gsub!就地修改字符串。

在 Rails 中,这已被移植到意味着该方法将在失败时引发异常而不是返回 nil 的情况。 .这在此处得到了最好的说明:

Record.find_by(id: 10) # => Can return nil if not found
Record.find_by!(id: 10) # => Can raise ActiveRecord::RecordNotFound

请注意,情况并非总是如此,如 find 之类的方法即使没有 ! 也会引发异常.它纯粹是方法名称中内置的信息组件,不保证它会或不会引发异常。

更新:

使用异常的原因是为了使流程控制更容易。如果您经常测试 nil ,您最终会得到如下所示的高度偏执的代码:
def update
if (user.save)
if (purchase.save)
if (email.sent?)
redirect_to(success_path)
else
render(template: 'invalid_email')
end
else
render(template: 'edit')
end
else
render(template: 'edit')
end
end

换句话说,你总是需要回头看看,以确保没有发生任何不好的事情。除了异常(exception),它看起来像这样:
def update
user.save!
purchase.save!
email.send!

redirect_to(success_path)

rescue ActiveRecord::RecordNotFound
render(template: 'edit')
rescue SomeMailer::EmailNotSent
render(template: 'invalid_email')
end

在哪里可以看到流程更容易理解。它将“异常情况”描述为不太可能发生,因此它们不会弄乱主代码。

关于ruby-on-rails - 有什么用!在 rails 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58273846/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com