我正在学习Rails,我正在开发一个非常基本的RSVP应用程序,如果用户同时输入了名称和电子邮件地址,我的用户模型中一个名为rsvp?
的方法将返回true
。
如果我的方法定义为:
def rsvp?
name.present? && email.present?
end
我得到的结果和以前一样:
def rsvp?
name? && email?
end
所以说name.present?
与name?
相同,我被告知name.present?
不仅会检查nil
值,还会检查空字符串值。但name?
似乎完成了同样的事情(测试了名称和电子邮件、名称但没有电子邮件等的所有四种排列)
present?
返回与blank?
相反的值。它们是Ruby核心Object
的Rails扩展。如果正在测试的值是nil
、""
、{}
、false
、[]
等…,则.present?
将返回false
。基于扩展Object
的类型(Array
、Hash
、String
等…)。
基于:name
等模型属性的name?
等方法实际上是通过ActiveRecord::AttributeMethods
中的method_missing
方法传递的,然后由ActiveModel::AttributeMethods
处理,最终由此类处理。
因此,是它们基本上是相同的(对于某些列类型,实际上调用了blank?
;与上面present?
中的blank?
相同),但它们并不完全相同,因为?
后缀方法会根据列类型进行一些额外的检查。