了解Ruby / Rails中的before_save

时间:2014-05-25 21:54:45

标签: ruby-on-rails ruby

before_save { self.email = email.downcase }

在上面的一行中,我认为before_save是一个方法。但是将其更改为以下内容会使其停止工作:

before_save({ self.email = email.downcase})

发生了什么事?这不是一种方法吗?

2 个答案:

答案 0 :(得分:5)

before_saveActiveRecord 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 }

它应该没有问题。