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服务以某种方式响应,在这种情况下它不会.
简短的回答:这取决于您的 JSON 服务。
\n\n首先,该服务是 RESTful 吗?如果是这样,那么你很幸运。ActiveResource 已经死了,所以我不建议使用它,但代码本身将为创建一组包装方法提供一个很好的起点,例如create
和find
访问 API 并以 ActiveRecord 在数据库中创建和查询记录的方式操作记录。如果您的 API 是 RESTful,那么这相对容易,因为Rails 是围绕 RESTful-ness 构建的,因此两者之间的映射变得更加清晰。
这篇文章总结得很好:
\n\n\n\n\nRails 使构建遵循 REST 原则的 Web 服务变得极其容易,并且与 Web 浏览器和可编程 Web 一起工作同样良好。事实上,很多简单性直接来自于遵循这些原则。我们不需要告诉我们的客户端如何创建、读取、更新或删除资源,这些都是通过使用正确的 HTTP 方法来实现的。我们所要做的就是将我们的客户指向正确的地方。
\n
如果您的服务不是RESTful,从对其他问题的评论来看,我认为可能是这种情况,那么您的工作就会完成。ActiveModel 不会为您完成这项工作:在ActiveRecord::Persistencecreate
中定义,并在ActiveRecord::FinderMethods中定义。\n它们不在 ActiveModel 中。ActiveResource 能够相当容易地重现它们,因为它对它所连接的服务类型做出了假设(即它是 RESTful,加上一些其他东西)。find
ActiveModel 提供的是使 Rails 在处理模型方面非常有用的所有其他功能:它的验证系统、序列化方法、属性更改的脏跟踪、回调( 、before_save
等after_save
)、翻译/本地化等等。这些都是非常有用的功能,但它们仍然给您带来了包装 API 调用的问题。
因此,根据我虽然有限的经验,我会推荐以下内容(请参阅我的最后说明):
\n\ncreate
围绕它创建一个 API 包装器,以实现find
以及您想要拥有的任何其他类似 ActiveRecord 的功能。您可能想要使用Faraday或HTTParty之类的 gem来实际向 API 发出请求,而不是直接使用 Net::HTTP。(我从未使用过 DataMapper,所以无法对此发表评论。)这将使您能够充分利用 JSON 服务作为 Rails 模型。
\n\n根据记录,我实际实现此类事情的经验仅限于构建用于访问 XML API 的 API 包装器(正在开发中)。该包装器有一个类,其中包含用于验证对 API 的查询的 ActiveModel 验证器。我发现 ActiveModel 验证器对于保证正确访问 API 非常有用,但包装器仅用于从 API 获取记录,而不是实际创建或更新它们,因此该界面比我的界面要容易得多期待你能建造。
\n