2011-01-26 90 views
2

这是非常基本的,但不起作用。我想添加一个回调函数(after_save)来提升字段输入。轨道上升

在我的模型,我有:

after_save :upcase_tax_label 

def upcase_tax_label 
    self.tax1_label.upcase! 
    self.tax2_label.upcase! 
end 

所以,当我编辑应该upcase价值和CAPS渲染。但不是。怎么了?感谢您的帮助

+1

同意。奥利维尔,你更有可能让人们继续回答你接受他们答案的问题。 :) – Shaun 2011-01-26 22:00:53

回答

3

after_save将在模型已经保存到数据库后运行upcase方法。换句话说,它只是在保存完成后提升内存中的对象属性。这不是你想要的。

你想改用before_save,使该对象被写入到数据库之前的属性upcased:

before_save :upcase_tax_label 

private 
def upcase_tax_label 
    tax1_label.upcase! 
    tax2_label.upcase! 
end 

底线是,你必须明确地保存在要做出的变化的模型数据库。在那之前,你只是在玩内存中的一个对象。

1
before_save 

将工作。然而,在这种情况下编写一个自定义setter通常被认为是更好的风格。它看起来像这样:

def tax1_label=(val) 
    write_attribute(:tax1_label, val.upcase) 
end 

def tax2_label=(val) 
    write_attribute(:tax2_label, val.upcase) 
end