2011-01-26 9 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

Olivier、あなたは答えを受け入れるというあなたの質問に人々が答え続けるようになる可能性が高いです。 :) – Shaun

+0

私は答えを受け入れなければならないか分からなかった。今やろう。ありがとう。しかし、私の問題を解決するための任意のアイデア? – Olivier

答えて

3

after_saveは、モデルが既にデータベースに保存された後にupcaseメソッドを実行しようとしています。言い換えれば、保存が完了した後で、オブジェクト属性をメモリにアップケーシングするだけです。それはあなたが望むものではありません。

あなたは属性がupcasedされるように、オブジェクトがデータベースに書き込まれる前に、代わりにbefore_saveを使用したい:

before_save :upcase_tax_label 

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

ボトムラインは、あなたが明示的に行われる変更のためのモデルを保存しなければならないということですデータベース。それまでは、メモリ内のオブジェクトで遊んでいるだけです。

1
before_save 

となります。しかし、一般に、この状況ではカスタムセッターを書く方が良い方法と考えられています。これは次のようになります。

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

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