我定义了一个名为ccy的方法,它接受一个数字num
,确定货币(父记录模型的一个属性),并返回乘以转换因子的数字。在这种情况下,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
为零。因此,例如,当我尝试在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
我在网上找了一段时间,似乎不知道该怎么解决这个问题。感谢帮助!
也许您有范围问题?在中
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
除了@monocle出色的重构建议:
您可能需要确保在保存记录时,设置了默认货币值。
类似于:
validates_presence_of :currency
before_save :default_currency
def default_currency
self.currency = "GBP" unless self.currency.present? #Woo Anglophilia!
end
您的货币选择器中可能还有一个/n(可能是隐式的):include_blank => true
,这样您就可以将这些空值存储在数据库中。