这两段代码有什么区别?第一个剪辑标记为“This one:”,第二个剪辑标记为“And this:”。 (.RB)
class Reseller < ActiveRecord::Base
attr_accessible :blah, :blah, :contact_email
这一个:
before_save { |reseller| reseller.contact_email = contact_email.downcase }
而且:
before_save { contact_email.downcase }
谢谢
答案 0 :(得分:4)
第一个将值设置回到持久化属性(或者至少它应该;我仔细检查)。
第二个只是降低它并且对结果没有任何作用。
如果第二个读contact_email.downcase!
,那么它应该修改实际属性。
&#34; bang&#34;方法遵循命名破坏性方法的Ruby惯例,例如,改变基础数据的方法,尾随!
。
注意:正如tadman指出的那样,您需要针对您的AR测试进行审核,以确保您的应用仍能正常运行,因为它可能会绕过某些AR&#39;神奇。
答案 1 :(得分:3)
第一个下载联系人电子邮件并保存,但不清楚它是否真的按指定工作。第二个创建一个被丢弃的临时值,并没有做任何有用的事情。
通常你会实现这些:
class Reseller < ActiveRecord::Base
before_save :downcase_contact_email
protected
def downcase_contact_email
self.contact_email = self.contact_email.downcase if (self.contact_email?)
end
end
如果downcase
实际存在,我在那里添加了保护,只调用contact_email
方法。您的before_save
可能会触发nil
值,因为您不清楚这里是否有任何验证。
作为一种风格问题,这种清理方法通常会被触发before_validation
,您有机会验证它是否已正确填充。在before_save
阶段,抓住任何问题为时已晚,并且中止保存就是绝对的最后手段。