【问题标题】:Organize External API Calls in Rails 4 - Module or Class?在 Rails 4 中组织外部 API 调用 - 模块还是类?
【发布时间】:2015-08-21 00:32:39
【问题描述】:

我正在创建一个 Rails 应用程序,它将使用很多外部 API,例如 SalesForce、FolderGrid(如 Dropbox)等,它们都将同步到我的数据库。我从来没有使用过外部 api 调用,所以我创建了一些带有分散方法的基本 Ruby 脚本来测试对这些资源的调用。现在我想用我的完整 Rails 应用程序来实现它们。

到目前为止,我首先在我的 /lib 文件夹中创建了一个目录来保存 api 调用模块/类..

/lib/apis/foldergrid.rb

现在我不确定组织代码的最佳方法是什么。在我的独立 Ruby 脚本中,我有 authenticating, creating a folder, auditing files, downloading files 等的方法。

模块中应该包含什么?我什至需要一个模块吗?课堂上应该有什么?如何确保可以在需要的地方在模型和控制器中使用这些方法?是否有关于外部 API 的最佳做法?

非常感谢任何资源、链接和/或更深入的理解。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 shared-libraries call


    【解决方案1】:

    我也有一个应用程序可以执行此操作(从多个 API 提取数据),因此我可以告诉您我会做什么(或者在某些情况下,如果我要重新开始,我现在会做什么)。

    数据存储

    首先,如果您已经将从这些数据中提取的数据持久化到 Rails 应用程序中,那么您将拥有代表数据本身的模型。这就是您在控制器中引用的内容,除非您的控制器负责调用 API。

    尽可能使用宝石

    其次,确保利用现有的用于 API 的 gem,这样您就不会重新创建身份验证轮,解析与应用程序之间的 JSON 等。例如:有一个 rest-force 用于销售人员的 gem。

    使用 Lib 中的 Ruby 对象在模型和 API 响应之间进行映射

    第三,我会将 API 响应和模型之间的数据映射到“普通旧 ruby​​ 对象”中,并将它们存储在 lib/apis 文件夹中(在这些情况下不需要存储在模块中,但恕我直言)。它们最终可能会非常实用,并且在映射数据的情况下,没关系。

    没有现有 Gem 的 API

    在这些情况下,我肯定会将它们保存在一个模块下的一个或多个类中,在它们自己的 lib 文件夹中。这样,您可以在需要时将它们解析为 Gem(或者如果您花时间将它们作为 Gem 开始,我相信其他人可以从中受益)。本周我自己刚刚开始使用Infoconnect's API,它没有 Gem(或任何语言的任何代码示例)。但我还不是很远。

    如果需要,为 V 和 C(视图和控制器)之间的代码创建服务对象

    如果您最终需要为 API 信息或调用这些请求的任何操作与用户进行交互,我会将它们放在 service objects 中,这样您的代码就不会在视图或控制器中变得臃肿。

    【讨论】:

    • 感谢您的彻底回复。您的 infoconnect API gem 非常有助于查看以及有关服务对象的博客。
    • 很高兴它有帮助。祝你的 Rails 应用好运!
    【解决方案2】:

    模块中应该包含什么?

    一个模块应该包含由不同类共享的代码,或者它可以添加到单个类中。

    我还需要一个模块吗?

    不,您可以通过继承实现相同的目的。如果没有可共享的代码,那么您可能不需要模块。

    我如何确保可以在需要时在我的模型和控制器中使用这些方法?

    您可以使用控制器中的类来访问它们:

    SalesForceAPI.get_data
    

    “模块还是类?”是 Ruby 和任何其他支持这两者的语言中的一个古老问题。

    我会将每个 API 的功能封装在一个类中。例如,您可以有一个 SalesForceAPI 类。然后,如果您需要在类之间共享身份验证、创建文件夹、审核文件或下载文件的功能,您可以创建一个API 类。

    每个需要访问API 类的类都将从它继承:

    SalesForceAPI < API
    

    您可以通过创建API 模块并将其混合到其他类中来实现相同的目的。在这种情况下,这主要是一个偏好问题,因为任何一种解决方案都是好的。

    FWIW,我不知道是否会有很多共享功能用于身份验证、创建文件夹、审核文件或下载文件,因为每个 API 的工作方式可能完全不同。但是,如果它们是 REST API,那么您可以创建一些 REST 辅助方法并将它们放在 API 类中。

    Practical Object Oriented Design Ruby 是一个很好的、易于理解且完整的主题资源。

    【讨论】:

    • 谢谢 B 七。这里有很多有用的信息!
    猜你喜欢
    • 2022-12-17
    • 2018-06-26
    • 2011-03-30
    • 2014-11-05
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多