Rails 3:取消在 after_save 上的插入

Posted

技术标签:

【中文标题】Rails 3:取消在 after_save 上的插入【英文标题】:Rails 3: cancel insert on after_save 【发布时间】:2012-06-01 14:53:22 【问题描述】:

我有一个模型,当插入记录时,需要调用网络服务。

如果 web 服务失败(超时或其他失败),它们在数据库中的保存也应该被恢复。

我使用 after_save 回调并尝试在发生此类错误时引发 ActiveRecord::Rollback。

虽然它在 object.save 上返回 false,但它不会回滚事务。这样做的正确方法是什么?

我怎样才能确保不会创建记录?

【问题讨论】:

【参考方案1】:

尝试使用 before_save 并从中返回 false。

【讨论】:

您可以在模型中查看id 存在。 id 只有在插入数据库后才会出现。【参考方案2】:

您是否将其包装在 Active Record 事务块中?

User.transaction do
  User.create(:username => 'Kotori')
  User.transaction(:requires_new => true) do
    User.create(:username => 'Nemu')
    raise ActiveRecord::Rollback
  end
end

另见:

http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

【讨论】:

以上是关于Rails 3:取消在 after_save 上的插入的主要内容,如果未能解决你的问题,请参考以下文章

具有虚拟属性的 after_save 回调 Rails 3

Rails ActiveRecord 在 after_save 回调中使用最近保存的记录 ID [关闭]

Rails after_save 回调未触发

Rails after_save 错误

Rails:是不是有跳过 after_save 过滤器的 save_without_validation 等效项?

确定 Rails after_save 回调中更改了哪些属性?