我正在为 Redmine (RoR 4.2) 开发一个插件,一旦创建/更新某种类型的问题,该插件应该将数据发送到不同的系统。
我已经为包含两个回调的问题创建了一个补丁:before_update
和 after_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/