如何在Rails中实现HATEOAS

时间:2013-08-07 01:31:45

标签: ruby-on-rails-3 hateoas

我已经开始使用ActiveResource,但很快就碰壁了。在覆盖基础模型上的to_json和to_xml时无法使ActiveResource工作。另外,无法使资源表示将链接注入到生成的xml文档中。哦顺便说一下,我正在使用Rails 3.2.1。

我做了一些研究,发现了它的宝石。试过它,由于某种原因不适合我。所以我的问题是:

如果我在一个网站(例如http://books.org)中托管了一个资源(比如说书),而在另一个网站上托管了另一个资源(比如学生,http://students.org),我该怎么办?获得书籍以完整的HATEOS荣耀为学生代表自己?

我能够将书籍资源表示为询问学生作为XML文档。我在学生网站上使用vanilla Rails ActiveResource做到了这一点。我创建了继承自ActiveResource::Base的Books资源。然后我指定了self.siteself.element_name,之后我能够针对远程图书网站执行一些基本的类似ActiveRecord的查询。对我有用的唯一事情是Book.allBook.find(1)。即使这样也不能令人满意,因为该表示包含所有数据库列,我想至少删除其中的一些,结果证明这是不可能的。

现在我已经放弃了这种方法,我想知道在Rails中是否有一个可行的例子,可以构建一个更复杂的资源表示(即书籍),其中包含将驱动应用程序状态的链接传递?我觉得简直令人难以置信的是,这样一个简单的要求似乎在Rails中实现起来非常困难。我所要做的就是创建一个资源的表示,其中包含一些链接,这些链接将指导消费者发现该资源的功能。我最感兴趣的是实现工作流程,这是一种分层的,剥离洋葱式的发现对话过程。

1 个答案:

答案 0 :(得分:1)

在Rails中,如果您希望在JSON中执行此操作,则需要更改对象序列化的方式。 (您需要覆盖Rails返回资源表示的方式。)执行此操作的最常见的宝石是:https://github.com/rails-api/active_model_serializers

如果您不想使用AMS或想要返回HTML,请考虑遵循此演示者模式:http://blog.steveklabnik.com/posts/2012-01-06-implementing-hateoas-with-presenters