5

私は、いくつかの異なるモデルに価格がある単純な小売商取引ソリューションを作成しています。これらの価格は合計価格に影響します。ヨーグルトのトッピングを選択するために 0.30 ドル余分に支払うことを想像してみてください。

priceフィールド を

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

データベース6.506.5. 標準的な Rails の方法でnumber_to_currency(price)は、ビューでフォーマットされた値を取得するために呼び出します。price適切にフォーマットされた文字列、つまり、ビューの直接の一部ではないいくつかの場所で $6.50 など、プログラムでフィールドを呼び出す必要があります。また、私のニーズは単純です (通貨換算などはありません)。 ビューで number_to_currency を繰り返し呼び出すことなく、価格をモデルで普遍的にフォーマットすることを好みます。

getter の価格を変更して、常にドル記号付きの小数点以下 2 桁、つまり $6.50 を返すようにする良い方法はありますか?

前もって感謝します。

アップデート

みんな、ありがとう。

数字をフォーマットするためだけにインクルードを行うのは非常に「ハック」に思えるので、私はアレックスのアプローチを使用することにしました。彼のアプローチを使用して、私は次のことを行いました。

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

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

乾杯。

更新 2

買い手責任負担。これを行うと、数値が文字列になるため、数値に対して操作を実行できなくなります。

私と同じように困っている人がいたら気をつけてください。

4

4 に答える 4

14

次のようなデータベースの属性のような名前のメソッドをモデルに追加するだけです。

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

これにより、フォーマットを完全に制御したり、Railsが提供するヘルパーメソッドを使用したりできます

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

これでうまくいくはずです。それが役に立てば幸い!

于 2012-04-07T11:28:01.823 に答える
2

helpers モジュールを使用できますが、モジュール全体を含めるべきではありません。これには、実際には必要のないメソッドが多数含まれているか、独自のメソッドの一部がオーバーライドされているためです。ただし、それらを直接使用できます。

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

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

def helpers
  ActionController::Base.helpers
end

"#{helpers.number_to_currency(6.5)}"

このレールキャストを見てください

于 2012-04-07T11:37:51.953 に答える
1

Draper(このreailscastを参照)のように、Presenterのアプローチを採用することをお勧めします。

別の解決策は、モデルに独自のメソッドを実装することです。formatted_priceつまり、独自に(つまり、ActionView::Helpers::NumberHelperモジュールを使用して)フォーマットを実行します。しかし、モデルはRailsアプリケーションのプレーンなデータを表すため、このようなことを行うのはちょっと怪しげで、設定より規約に干渉すると思います。

于 2012-04-07T11:28:51.810 に答える
-1

試す

include ActionView::Helpers::NumberHelper

あなたのモデルに

于 2012-04-07T11:25:44.317 に答える