在模型保存上生成并发送xml

时间:2016-01-24 12:24:13

标签: ruby-on-rails

我需要从模型生成xml并将其发送到模型保存的Web服务。 我确信这是一个常见的案例,应该是直截了当的。只需在after_save回调上创建一个生成xml并将其发送到端点的作业。

由于我是Ruby on Rails的新手,我不确定如何处理这个问题。我的问题更多的是关于代码组织。这种api连接将来不会停止使用,因此我需要一种干净的模块化方式来摆脱它。将它放在一个单独的宝石中是最佳做法/惯例吗? Gems实际上可以将作业添加到现有的rails队列吗? Gems可以在安装时创建迁移吗?我可能需要添加一个模型来跟踪api同步。如何在gem卸载上删除表?或者根本不应该使用宝石?

我意识到这些是广泛而基本的Ruby on Rails问题,但我有点淹没在文档中。我只是希望提供一些示例和/或建议,以及对相关文档的一些指示。感谢。

2 个答案:

答案 0 :(得分:1)

Gem安装/卸载与应用程序无关,它们位于不同的级别,除非已加载,否则不会对应用程序代码,db等进行任何操作。

用于rails的Gems可以提供rake任务和/或生成器,例如,你可以查看devise gem结构如何做到这一点。

但我建议您在知道必须之前将代码移动到gem中,例如当您需要在不同的项目中重用它时。

要在单个项目中重用代码 - 请使用mixins / concerns

答案 1 :(得分:1)

一般来说:

  1. 不要把它变成宝石
    • 这是一个不必要的痛苦世界,几乎总是如此,
    • 除非您打算在3 +应用程序中以相同的方式使用它,否则永远不会创建任何宝石
  2. 不要把它提取到一个问题中,
    • 您似乎很可能不会在多个模型上执行相同的操作,代码重用似乎不是问题,您实际上也可以使用服务类更有效地重用代码
    • 许多经验丰富的Rails程序员将此practice视为concerning,原谅双关语。 Rails开发团队似乎没有共享这个视图,但至少从我编写服务类的经验看起来似乎是不必要的复杂性,直到你的项目增长到足够然后你需要重构一个BUNCH的东西并且你意识到你会更好从一开始就放弃了关注
    • 使用服务类,并从模型
    • 委托必要的方法
    • 这将为您提供一个干净的界面以便稍后提取,如果您需要模拟XML服务以进行测试,还可以使用依赖注入
  3. 不要将API请求与模型回调联系起来,通常只有2-3个地方需要对API执行某些操作,而其他一些情况可能并非如此,想象一下:
    • 测试,
    • 或者如果您需要实现缓存列,
    • 或"访问次数"专栏
    • 或像Paperclip这样的宝石认为它想要在模型中添加一些东西但改变了主意而不是仅仅触及了updated_at
    • 或任何此类技巧将使您成为宏伟的API垃圾邮件发送者和VERRRRY的数据库更新缓慢的受害者
  4. 如果您将API请求绑定到模型回调,
    • 然后你最好确保错误处理正确完成,超时等不会回滚或延迟你的数据库操作,
    • 根据我的经验,最好的方法是通过ActiveJob + one of the backends运行这些内容(虽然显然不是:inline后端,理想情况下是不使用您的后端之一主数据库并允许异步作业提交 - 作为候选人想到sidekiq