0

num数値を受け取り、通貨(親レコードモデルの属性)を決定し、数値に変換係数を掛けた値を返すccyというメソッドを定義しました。この場合、Selfは、独自の属性をいくつか持ち、Recordに属する設定を指します。この方法は、以下の設定モデルで定義されています。

class Setting < ActiveRecord::Base
  belongs_to :record

  def ccy(num)
    self.record.currency == "USD" ? ( num * 1 ) :
    self.record.currency == "GBP" ? ( num * 0.616181 ) :
    self.record.currency == "EUR" ? ( num * 0.70618 ) :
    self.record.currency == "CAD" ? ( num * 0.97415 ) : nil
  end
end

ただし、これは機能しません。いくつかのテストを行った後、それself.record.currencyがゼロであることがわかったためです。したがって、たとえばRailsアプリケーションのようなことをしようとするとself.ccy(100)、次のエラーが発生します。

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.*

またはこれ、nil要素で何らかの演算子を使用している場合:

TypeError: nil can't be coerced into Fixnum

私は少しの間オンラインを見回しました、そして私はこれを修正する方法を正確に理解することができないようです。感謝します!

4

2 に答える 2

4

多分あなたはスコープの問題を抱えていますか?の

def ccy(num)
  self ...

そこにある自己は、設定(@setting)のインスタンスを参照しています。

また、このメソッドはレコードモデルに含まれている必要があるようです。また、変換にハッシュを使用することを検討することもできます。

class Setting < ActiveRecord::Base
  belongs_to :record
  delegate :convert_currecy, :to => :record
end

class Record < ActiveRecord::Base

 CURRENCY_CONVERSION_FACTOR =
  {
    "USD" => 1,
    "GBP" => 0.616181
  }

  def convert_currency(num)
    CURRENCY_CONVERSION_FACTOR[currency] * num
  end
于 2011-06-07T22:13:58.860 に答える
1

@monocleの優れたリファクタリングの提案に加えて:

レコードを保存するときに、デフォルトの通貨値が設定されていることを確認することをお勧めします。

何かのようなもの:

  validates_presence_of :currency
  before_save :default_currency
  def default_currency
     self.currency = "GBP" unless self.currency.present? #Woo Anglophilia!
  end

:include_blank => trueまた、これらの空の値をデータベースに格納するように、通貨セレクターにa / n(暗黙的である可能性があります)がある場合があります。

于 2011-06-07T22:32:27.517 に答える