before_save { self.email = email.downcase }
在上面的一行中,我认为before_save是一个方法。但是将其更改为以下内容会使其停止工作:
before_save({ self.email = email.downcase})
发生了什么事?这不是一种方法吗?
答案 0 :(得分:5)
before_save
是ActiveRecord callback,用于执行代码块,例如原始帖子中的第一个代码示例。
如果你不想在一个块中执行代码,或许你需要的东西对于一个简单的块来说太长了,你也可以使用这个回调来调用/执行你自己设计的方法,如下例所示。
before_save :my_awesome_pre_save_method
# somewhere in your model (typically in a protected method)
protected
def my_awesome_pre_save_method
self.email.downcase!
end
对于您已经显示的示例(在保存之前封装电子邮件),我的感觉是块方法比方法调用更好。
答案 1 :(得分:3)
澄清一下,因为我觉得接受的答案根本没有解决这个问题,所以before_save绝对是一种方法。您的代码无法工作的原因并不是因为before_save不是方法,因为在Ruby中,一个块不会作为参数传递给方法,它会追溯到该方法之后。如果你写了:
before_save() { self.email = email.downcase }
它应该没有问题。