2016-01-24 36 views
1

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

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

我意识到这是广泛的和基本的Ruby on Rails的问题,但我的文档类溺水。我只是希望得到一些例子和/或建议,也许还有一些指向相关文档的指针。谢谢。

回答

1

宝石安装/卸载量无关的应用程序,他们生活在不同程度上,不KHOW关于你的应用程序代码的任何东西,DB等,除非它们被加载。

宝石钢轨可以提供rake任务和/或发电机,例如你可以看看devise宝石结构上它是如何做到这一点。

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

要重新使用单项目中的代码 - 使用混入/关注

1

一般:

  1. 不让它宝石
    • 这是痛苦的不必要的世界里,几乎总是,
    • 绝不会让任何东西成为宝石,除非您打算在3+应用程序中以相同方式使用它
  2. 没有提取到一个问题或者,
    • 似乎并不很可能你会做多模型相同的操作,代码重用似乎不是在这里是一个问题,你实际上可以重用代码更有效地利用服务类太
    • 了很多有经验的程序员的Rails认为这practiceconcerning,原谅这个双关语。看来这种观点并不是由Rails开发团队共享的,但至少从我的经验来看,编写服务类似乎是不必要的复杂性,直到你的项目增长足够多,然后你需要重构一大堆东西,并且你意识到自己会变得更好从一开始就抛弃顾虑
    • 使用服务类,而不是从模型委托必要的方法将其
    • 这将留下一个干净的界面后提取,也将让你,如果你需要使用依赖注入模拟您的XML服务进行测试
  3. 不会将API请求绑定到模型回调,通常只有2-3个地方需要您执行某些操作个API和其他案件一堆那里可能并非如此,试想:
    • 测试,
    • 或者如果你的要求,以实现缓存列,
    • 或“访问次数”列
    • 或类似的认为它想的东西添加到模型,但改变了主意,而不是说只是触及updated_at
    • 或任何这样的欺骗,这将让你成为一个宏伟的API垃圾邮件发送者和患者的回形针宝石VERRRRY数据库更新缓慢
  4. 如果你做配合API请求模型回调,
    • ,那么你最好确保错误处理得当和超时等不回滚或延缓你的数据库操作,
    • 最好的方法,从我的经验是通过ActiveJob + one of the backends运行这些东西(虽然显然不是:inline后端和最好不使用你的主数据库,并允许异步作业提交的后台之一 - sidekiq想到为候选人)