Метод Ruby возвращает ноль, проблема с самостоятельной ссылкой - PullRequest
0 голосов
/ 08 июня 2011

Я определил метод ccy, который принимает число num, определяет валюту (атрибут родительской модели записи) и возвращает число, умноженное на коэффициент преобразования.Self в данном случае относится к настройке, которая имеет ряд собственных атрибутов и принадлежит записи.Метод определен в модели настроек ниже:

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 равен нулю.Поэтому, когда я пытаюсь сделать что-то вроде 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 element:

TypeError: nil can't be coerced into Fixnum

Я немного заглянул в онлайн и не могу понять, как это исправить.Помощь оценена!

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

Может быть, у вас проблема с объемом? В

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
1 голос
/ 08 июня 2011

В дополнение к превосходному предложению @ 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 в вашем селекторе валюты, так что вы получаете эти пустые значения, хранящиеся в БД.

...