0

我已经定义了一个名为 ccy 的方法,它接受一个数字num,确定货币(父 Record 模型的一个属性)并返回该数字乘以一个转换因子。在这种情况下,Self 指的是一个 Setting,它有许多自己的属性并且属于 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是 nil。因此,例如,当我尝试self.ccy(100)在 rails 应用程序中执行类似操作时,我收到以下错误:

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 ...

那里的 self 指的是 Setting (@setting) 的一个实例。

这个方法似乎也应该在您的 Record 模型中。此外,您可以考虑使用哈希进行转换:

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

您的货币选择器中可能还有 a/n(可能是隐式的):include_blank => true,这样您就可以将这些空值存储在数据库中。

于 2011-06-07T22:32:27.517 回答