Ruby方法返回nil,自引用有问题



我定义了一个名为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,这样您就可以将这些空值存储在数据库中。

最新更新