首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用JSON服务作为Rails模型

使用JSON服务作为Rails模型
EN

Stack Overflow用户
提问于 2012-08-02 23:44:51
回答 5查看 2.3K关注 0票数 6

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

我想将模型方法链接到JSON请求。

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

构建这种功能的首选方法是什么?我正在考虑的一个选项是创建一个自定义DataMapper适配器。

谢谢。

更新:

请注意,我不能使用ActiveResource,因为这需要JSON服务以某种方式进行响应,而在本例中却并非如此。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-13 21:22:07

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

对于初学者来说,服务是RESTful吗?如果是的话,你很幸运。ActiveResource是死了,所以我不建议使用它,但是代码本身将为创建一组包装器方法(如createfind )提供一个很好的起点,以访问您的API,并按照ActiveRecord在DB中创建和查询记录的方式来操作记录。如果你的API是RESTful,那就比较容易了,因为rails是围绕RESTful-ness构建的。,所以两者之间的映射变得更清晰了。

这篇文章很好地总结了这一点:

Rails使构建遵循REST原则并与Web浏览器和可编程Web同等工作的Web服务变得极其容易。事实上,许多简单性都直接来自于遵循这些原则。我们不必告诉客户端如何创建、读取、更新或删除资源,所有这些都是通过使用适当的HTTP方法来实现的。我们所要做的就是让我们的客户找到合适的地方。

如果您的服务不是RESTful,从我认为可能是这样的其他问题的评论来看,那么您的工作就会为您准备好了。ActiveModel不会为您完成这项工作:create是用ActiveRecord::持久性定义的,find是在ActiveRecord::FinderMethods中定义的。他们不在ActiveModel。ActiveResource能够相当容易地再现它们,因为它对与之接口的服务类型进行了假设(即它是RESTful,再加上一些其他东西)。

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

因此,根据我有限的经验(见我关于这一点的最后说明),以下是我的建议:

  1. 首先,仔细看看你的API,找出它离RESTful有多近。如果不是RESTful,那么您必须考虑如何解决这个问题,这样就可以把它当作RESTful服务来处理。关于如何做到这一点的一个很好的参考是O‘’Reilly的RESTful网络服务 (特别是第2章,“编写Writing”)。
  2. 围绕它创建一个API包装器,实现createfind和其他类似ActiveRecord的功能。您可能希望使用类似于法拉第HTTParty的gem来实际向API发出请求,而不是直接使用Net::HTTP。(我从未使用过DataMapper,因此不能对此发表评论。)
  3. 包含您希望使用的任何ActiveModel元素,使包装器类更像一个rails模型:验证、序列化等。在Rails 4中,您实际上可以使用新的基本ActiveModel::Model包含所有内容。

这将使您能够在很大程度上使用JSON服务作为Rails模型。

作为记录,我在实际实现这类事情方面的经验仅限于构建一个API包装器(正在工作中)来访问XML。包装器有一个类,其中包括用于验证对API的查询的ActiveModel验证器。我发现ActiveModel验证器对于确保正确访问API非常有用,但是包装器只用于从API中获取记录,而不是实际创建或更新记录,因此接口比我预期的要容易得多。

票数 3
EN

Stack Overflow用户

发布于 2012-08-03 05:28:38

我认为您要寻找的是ActiveResource,您可以使用它而不是ActiveRecord来使用RESTful JSON (参见此链接这个(顶格) )

票数 1
EN

Stack Overflow用户

发布于 2012-08-11 09:08:30

最好的方法是实现一个ActiveModel。这个铁轨涵盖了基本内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11787394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档