2016-03-06 6 views
0

У меня есть метод/действие/часть кода (я всегда немного теряю терминологию рельсов), настроенный в моей модели, чтобы обновить оставшуюся сумму в бюджете при вводе новое объявление.Расчет в модели с ошибкой для задачи рейка

class Budget < ActiveRecord::Base 
belongs_to :client 
has_many :adverts 
before_save :update_budget 

validates :name, :amount, :client_id, presence: true 

def update_budget 
    self.amount_remaining = self.amount - self.amount_spent 
end 
end 

Это прекрасно работает при обновлении моих бюджетов или вводе нового объявления. Все работает так, как должно. Тем не менее, я написал задачу грабли, чтобы написать список повторяющихся бюджетов в таблицу бюджета (чтобы я мог планировать ее ежемесячно). Однако, когда я запускаю эту задачу с терминала, она сталкивается с ошибкой.

The rake task.

desc "Recurring Updates" 
task :recurring_budgets => :environment do 
    @recurring_budgets = RecurringBudget.all 
    @recurring_budgets.each do |recurring_budget| 
     Budget.create(name: recurring_budget.name, amount: recurring_budget.amount, client_id: recurring_budget.client_id) 
    end 
end 

Ошибка.

$ rake recurring_budgets 
rake aborted! 
TypeError: nil can't be coerced into Fixnum 
/Users/tomgamon/projects/adsman/app/models/budget.rb:9:in `-' 
/Users/tomgamon/projects/adsman/app/models/budget.rb:9:in `update_budget' 
/Users/tomgamon/projects/adsman/lib/tasks/recurring_budgets.rake:6:in `block (2 levels) in <top (required)>' 
/Users/tomgamon/projects/adsman/lib/tasks/recurring_budgets.rake:5:in `block in <top (required)>' 
Tasks: TOP => recurring_budgets 
(See full trace by running task with --trace) 

Стоит отметить, когда я удалить метод из моей модели, задача записывает в бюджет таблицы штрафа.

У кого-нибудь есть идеи?

ответ

1

Это связано с вами пытались minusnil из amount

update_budget называется в before_save callback - и здесь вы вычисления amount_remaining с вычитанием amount_spent из amount в вашем случае amount_spent является nil, поэтому при попытке вычитания nil значение из то вы получите эту ошибку - TypeError: nil can't be coerced into Fixnum

Для этого есть два решения -

1 - если amount_spent является nil вы должны использовать 0

def update_budget 
    self.amount_remaining = self.amount - (self.amount_spent || 0) 
end 

ИЛИ

2 - Вы можете установить значения по умолчанию для amount_remaining, amount и amount_spent как 0 (Ноль) в миграции.

Лучше установить значения по умолчанию для таких полей вместо того, чтобы проверять значения nil в коде.

+1

Блестящий. Я добавил значения по умолчанию в таблицу и теперь работает отлично. Благодаря! – thrgamon

 Смежные вопросы

  • Нет связанных вопросов^_^