使用JSON服务作为Rails模型

gjb*_*gjb 6 json model ruby-on-rails ruby-on-rails-3

如何将JSON服务用作Rails 3.2应用程序的模型?

我想将模型方法链接到JSON请求,例如

  • MyModel.create 生成JSON请求以创建新记录
  • MyModel.find 生成JSON请求以检索记录并将JSON响应解码为模型对象

构建此类功能的首选方法是什么?我正在研究的一个选项是创建一个自定义DataMapper适配器.

谢谢.

更新:
请注意,我不能使用ActiveResource,因为这需要JSON服务以某种方式响应,在这种情况下它不会.

Chr*_*erg 3

简短的回答:这取决于您的 JSON 服务。

\n\n

首先,该服务是 RESTful 吗?如果是这样,那么你很幸运。ActiveResource 已经死了,所以我不建议使用它,但代码本身将为创建一组包装方法提供一个很好的起点,例如createfind访问 API 并以 ActiveRecord 在数据库中创建和查询记录的方式操作记录。如果您的 API 是 RESTful,那么这相对容易,因为Rails 是围绕 RESTful-ness 构建的,因此两者之间的映射变得更加清晰。

\n\n

这篇文章总结得很好:

\n\n
\n

Rails 使构建遵循 REST 原则的 Web 服务变得极其容易,并且与 Web 浏览器和可编程 Web 一起工作同样良好。事实上,很多简单性直接来自于遵循这些原则。我们不需要告诉我们的客户端如何创建、读取、更新或删除资源,这些都是通过使用正确的 HTTP 方法来实现的。我们所要做的就是将我们的客户指向正确的地方。

\n
\n\n

如果您的服务不是RESTful,从对其他问题的评论来看,我认为可能是这种情况,那么您的工作就会完成。ActiveModel 不会为您完成这项工作:在ActiveRecord::Persistencecreate中定义,并在ActiveRecord::FinderMethods中定义。\n它们不在 ActiveModel 中。ActiveResource 能够相当容易地重现它们,因为它对它所连接的服务类型做出了假设(即它是 RESTful,加上一些其他东西)。find

\n\n

ActiveModel 提供的是使 Rails 在处理模型方面非常有用的所有其他功能:它的验证系统、序列化方法、属性更改的脏跟踪、回调( 、before_saveafter_save)、翻译/本地化等等。这些都是非常有用的功能,但它们仍然给您带来了包装 API 调用的问题。

\n\n

因此,根据我虽然有限的经验,我会推荐以下内容(请参阅我的最后说明):

\n\n
    \n
  1. 首先,仔细查看您的 API 并了解它与 RESTful 的接近程度。如果它不是RESTful,您将必须考虑如何解决这个问题,以便您可以将其视为 RESTful 服务。关于如何执行此操作的一个很好的参考是 O\'Reilly\'s RESTful Web Services(特别是第 2 章“编写 Web 服务客户端”)。
  2. \n
  3. create围绕它创建一个 API 包装器,以实现find以及您想要拥有的任何其他类似 ActiveRecord 的功能。您可能想要使用FaradayHTTParty之类的 gem来实际向 API 发出请求,而不是直接使用 Net::HTTP。(我从未使用过 DataMapper,所以无法对此发表评论。)
  4. \n
  5. 包含您想要使用的 ActiveModel 的任何元素,以使您的包装类更像 Rails 模型:验证、序列化等。在 Rails 4 中,您实际上可以使用新的准系统ActiveModel::Model包含所有内容。
  6. \n
\n\n

这将使您能够充分利用 JSON 服务作为 Rails 模型。

\n\n

根据记录,我实际实现此类事情的经验仅限于构建用于访问 XML API 的 API 包装器(正在开发中)。该包装器有一个类,其中包含用于验证对 API 的查询的 ActiveModel 验证器。我发现 ActiveModel 验证器对于保证正确访问 API 非常有用,但包装器仅用于从 API 获取记录,而不是实际创建或更新它们,因此该界面比我的界面要容易得多期待你能建造。

\n