ruby-on-rails - rails : rollback from after_create without throwing Exception

标签 ruby-on-rails activerecord

我正在为 Redmine (RoR 4.2) 开发一个插件,一旦创建/更新某种类型的问题,该插件应该将数据发送到不同的系统。

我已经为包含两个回调的问题创建了一个补丁:before_updateafter_create。两者调用相同的方法来执行。我使用 after_create 的原因是我需要将新创建的 Issue 的 ID 发送到第二个系统。

我的问题是,虽然从 before_update 返回 false 会取消事务,但从 after_create 执行此操作没有任何效果。为了处理这个问题,我需要抛出一个异常,它又会破坏问题 Controller ,使其返回Error 500页面,而不是一个漂亮的错误弹出窗口。

考虑到我不愿意覆盖 Controller (如果可能),处理这种情况的最佳方法是什么?

最佳答案

这听起来像是一个傻瓜的差事,因为异常通常是在 Controller 层处理的。当然,您可以在回调方法中挽救异常,例如记录一条消息。

但是,如果不诉诸一些非常讨厌的黑客手段,你就无法真正影响模型回调的 Controller 结果。模型应该只关心它自己的状态 - 而不是应用程序流程。

ActiveRecord 并不真正关心 after_* 回调的返回值。

胖模型和瘦 Controller 都很好。但是让你的模型做一些事情,比如通过网络交谈或发送电子邮件通常是一个糟糕的主意。 ActiveRecord 模型仅仅维护数据和业务逻辑就已经做了一百万件事情。他们不应该关心诸如当您对 API x 的请求失败时会发生什么之类的事情。

您可能需要考虑使用 Service Object来包装创建和更新模型。

关于ruby-on-rails - rails : rollback from after_create without throwing Exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33237772/

相关文章:

ruby-on-rails - 我可以使用 ActiveRecord 范围作为实例方法吗?

ruby-on-rails - nokogiri 无法安装 osx

ruby-on-rails - Rails-使用外部 SOAP API 的最佳方式?

javascript - 如何在rails应用程序中使用任何javascript代码?

javascript - Google map 未以部分 View 显示

ruby-on-rails - 覆盖 has_many 关系的模型名称

ruby-on-rails - Rails : after using scaffold, 我无法迁移

ruby-on-rails - AbstractController::DoubleRenderError cannot be fixed with “redirect_to and return”

ruby-on-rails - 为相关数据库创建Rails下拉列表

php - 如何使用事件记录模式在 codeigniter 中运行此 MySQL 查询