我的模型中设置了一个方法/操作/一段代码(我总是对轨道的术语有点迷失),以便在输入新广告时更新预算中的剩余金额。
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
这在更新预算或输入新广告时效果很好。一切都按预期工作。但是,我已经编写了一个耙子任务来将经常性预算列表写入预算表(因此我可以每月安排一次)。但是,当我从终端运行此任务时,它会遇到错误。
耙子任务。
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)
值得注意的是,当我从模型中删除该方法时,任务可以很好地写入预算表。
有人有什么想法吗?
由于您试图从amount
minus
nil
update_budget
before_save callback
调用 - 在这里,您计算amount_remaining
,从amount
中减去amount_spent
,在这种情况下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
值。