Ruby on rails 前过滤器语法差异

Ruby on rails 前过滤器语法差异,ruby-on-rails,ruby,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3.2,这两段代码之间有什么区别?第一个剪辑被标记为This one:第二个剪辑被标记为This:。铷 class Reseller < ActiveRecord::Base attr_accessible :blah, :blah, :contact_email 这是: before_save { contact_email.downcase } 谢谢首先将值设置回持久化属性,或者至少应该设置;我会再检查一遍 第二种方法只是将其降级,对结果没有任何影响 如果第二次阅读请联系\u email.

这两段代码之间有什么区别?第一个剪辑被标记为This one:第二个剪辑被标记为This:。铷

class Reseller < ActiveRecord::Base
attr_accessible :blah, :blah, :contact_email
这是:

before_save { contact_email.downcase }
谢谢

首先将值设置回持久化属性,或者至少应该设置;我会再检查一遍

第二种方法只是将其降级,对结果没有任何影响

如果第二次阅读请联系\u email.downcase!然后它应该修改实际属性

bang方法遵循Ruby的命名破坏性方法的约定,例如,使用尾随符号改变底层数据的方法


注意:正如塔德曼所指出的,你需要对照AR测试来检查这一点,以确保你的应用程序仍能按预期运行,因为它可能会绕过AR的一些魔力。

第一步是关闭联系人电子邮件并保存它,尽管不清楚这是否真的能按规定工作。第二个创建了一个临时值,该值被丢弃,并且不做任何有用的事情

通常,您可以执行以下操作:

 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方法。您的before_save可能会触发nil值,因为不清楚您是否有任何验证


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

对ActiveRecord属性进行就地修改可能会有风险,因为这会扰乱脏跟踪。就ActiveRecord而言,没有任何变化。总的来说,你是对的,不过,就地修改会更好。@tadman同意——如果所有AR都被使用,我会非常紧张。第二种情况不会抛出NoMethodError吗?块中的self是转销商类。有可能块绑定被转移到实例,但我不确定在Rails 3和Rails 4中的行为如何。@MarekLipka嗯,这可能是因为我说得太早了。
 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