Ruby模型回调无法运行?

时间:2015-09-04 09:57:34

标签: ruby-on-rails ruby model callback

是否存在回调无法运行的情况?

大约4-5天前,回调已经出现了#34;在某些型号上随机停止运行。问题是它是间歇性的。

最简单的是:

after_create :generate_tokens
def generate_tokens
  self.update(ref: Devise.friendly_token[0,10])
end

正在创建模型,其中ref为nil。整个餐桌上似乎随机都是胡椒。

当我重新部署对乘客进行重置时,它会重新开始工作。很明显,代码中的某些内容"中断"并且需要重置,但不会显示任何错误或系统投诉。

  • Rails 4.2.0
  • Ruby 2.2.1p85
  • 的Apache / 2.4.7
  • Passenger 5.0.4

由于

2 个答案:

答案 0 :(得分:1)

我会将after_create回调更改为before_validate回调。然后ref在与新对象相同的事务中写入数据库。并且 - 作为奖励 - 您可以添加验证模型中是否存在ref值:

before_validation :generate_tokens, on: [:create]
validates! :ref, presence: true, on: :create

private
def generate_tokens
  self.ref = Devise.friendly_token[0,10]
end

答案 1 :(得分:0)

ActiveRecord #update返回一个布尔值,告知更新是否已完成。由于未使用返回或捕获代码可能无法通过(对于实例的验证错误)而没有看到错误。

由于此处的回调是after_create,因此您的对象将被保留,但generate_tokens可能会下降。我建议你将代码切换到

def generate_tokens
  self.update!(ref: Devise.friendly_token[0,10])
end

它会引发异常,因此可以帮助您发现问题。