0

这两个代码片段有什么区别?第一个剪辑标记为“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 }

谢谢

4

2 回答 2

4

第一个将值设置持久属性(或者至少应该;我会仔细检查)。

第二个只是将其小写并且对结果不做任何事情。

如果第二次读取contact_email.downcase!,那么它应该修改实际属性。

"bang" 方法遵循 Ruby 命名破坏性方法的约定,例如,改变底层数据的方法,带有尾随!.

注意:正如 tadman 所指出的,您需要针对您的 AR 测试进行审查,以确保您的应用程序仍然按预期运行,因为它可能会绕过 AR 的一些魔力。

于 2013-08-07T19:43:04.617 回答
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_savenil

作为一种风格,像这样的清理方法通常会before_validation在您有机会验证它是否正确填充时触发。在这个before_save阶段,发现任何问题都为时已晚,而中止保存是您绝对不得已的最后手段。

于 2013-08-07T19:44:10.867 回答