2012-04-07 17 views
5

私は価格は、いくつかの異なるモデルである簡単な小売商取引ソリューションを、作っています。これらの価格は合計のに寄与します。あなたのヨーグルトのトッピングを選択するための$ 0.30をもっと支払うと想像してください。私は、データベース格納しRailsの - 通貨形式としてフォーマット番号ゲッターで

t.decimal :price, precision:8, scale:2 

6.5として6.50priceフィールドを設定

。私は標準的な方法で、number_to_currency(price)と呼んで、ビューでフォーマットされた値を取得することを知っています。プログラマチックにpriceフィールドと書式設定された文字列、つまりビューの一部ではない$ 6.50の部分を呼び出す必要があります。また、私のニーズは単純で(通貨換算などはありません)、ビューでnumber_to_currencyを繰り返し呼び出すことなく、モデルに普遍的にフォーマットされた価格を持つことを好みます。

は、私はそれを呼び出してたときに、それは常に、すなわち$ 6.50ドル記号を持つ2つの小数点以下の桁数を返すような価格のための私のゲッターを変更することができる良い方法はありますか?

ありがとうございます。

UPDATE

みんなありがとう。

私はそれだけで数をフォーマットするための含まれを行うには非常に「ハック」と思われるので、アレックスのアプローチを使用することを選択しました。彼のアプローチを使用して、私はした:

def price_change=(val) 
     write_attribute :price_change, val.to_s.gsub(/[\$]/,'').to_d 
    end 

    def price_change 
    "$%.2f" % self[:price_change] 
    end 

乾杯。

UPDATE 2

買主の危険負担。一旦これを行うと、それは今や文字列になっているので、数字への操作を行う能力が失われます。

誰も私と同じ問題に直面している場合は注意してください。あなたの完全な制御を超える与え

def price 
    "$%.2f" % self[:price] 
end 

答えて

12

が同じように、データベース内の自分の属性のように命名されたモデル内のメソッドを追加するには、モデルに

include ActionView::Helpers::NumberHelper 

を試してみてください書式設定やRailsの提供ヘルパーメソッドを使用し

def price 
    ActionController::Base.helpers.number_to_currency(self[:price]) 
end 

これはトリックを行う必要があります。 助けてください!

+1

感謝を見てください!いくつかの数値書式が組み込まれている必要があると考えていました。モデルにActionViewまたはActionControllerを含めるのを少し注意しました。 –

+0

この問題は、価格を数字として使うことができないことです。どこでも文字列です。私はレールヘルパーをto_sでこのように変換する方法を探しています – Joelio

1

私は(this reailscastを参照)ドレイパーのように、プレゼンターのアプローチと一緒に行くんことをお勧めしたいです。

もう1つの解決策は、お客様のモデルに独自のメソッド(formatted_price)を実装し、独自にフォーマットすることです(ActionView::Helpers::NumberHelperモジュールを使用)。しかし、モデルはあなたのレールアプリケーションのプレーンなデータを表しているので、このようなやり方でややこしいことはありません。

2

helpersモジュールを使用することはできますが、モジュール全体を含めるべきではありません。なぜなら、実際には必要としないメソッドや、いくつかのものをオーバーライドするメソッドがたくさんあるからです。しかし、それらを直接使用することもできます。

ActionController::Base.helpers.number_to_currency(6.5) 
#=> "$6.50" 

また、ヘルパーのメソッドを定義して簡単に使用することもできます。

def helpers 
    ActionController::Base.helpers 
end 

"#{helpers.number_to_currency(6.5)}" 

このrailscast

+0

ありがとう。上のように、これに少し気をつけて、MVCを破るようです。私は実際に両方を試してみる) –

関連する問題