在过滤语法差异之前

时间:2013-08-07 19:36:43

标签: ruby-on-rails ruby ruby-on-rails-3.2

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

谢谢

2 个答案:

答案 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阶段,抓住任何问题为时已晚,并且中止保存就是绝对的最后手段。