Ruby on rails 前过滤器语法差异
这两段代码之间有什么区别?第一个剪辑被标记为This one:第二个剪辑被标记为This:。铷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.
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