rails,实现主细节但保持RESTful

时间:2013-04-19 09:43:23

标签: ruby-on-rails rest master-detail

假设我有一个客户和订单表,其中每个客户可能有许多订单。

由于在rails中我们鼓励以RESTful样式表示这些资源,我们的每个资源都将响应以下操作

  • 索引
  • 显示
  • 修改
  • 创建
  • 删除

到目前为止,这一切都非常公平公正。但是现在说每次打开我的客户的展示页面时,我想显示一个包含他/她的所有订单的详细信息表。
这是一个非常普遍的需要,但这不是“不干净”的宁静方法的正确性吗? 是否有一些解决方法,例如在“视图级别”将两个资源“混合”,使它们与其余观点分开?

2 个答案:

答案 0 :(得分:1)

Rails的默认约定确保RESTful应用程序,并且这可能变得非常宁静的唯一方法是在路由上使用自定义名称,在这种情况下,您需要添加额外的代码来指定HTTP方法。

所以,要完成你的建议,在视图级别,你可能会有这样的事情:

应用程序/视图/客户/ show.html.erb

....
<% if customer.orders.any? %>  #the orders method is provided on `customer` by defining the `has_many` and `belong_to` associations
  <%= render @orders $>

并确保在@orders文件的show操作中定义customers_controller.rb

这不仅是RESTful,而且还适用于Rails的默认约定。

答案 1 :(得分:1)

你列出的那些动作并不是什么使RESTful成为现实。应用程序必须具有许多特性才能被视为RESTful。其中一些特征是:

  • 它被认为是资源的存储库
  • 资源由URI标识
  • 有一个统一的界面可以与资源进行交互 - GETPOSTPUTDELETE等的HTTP动词。

Rails负责接收HTTP请求并通过路由调用应用程序的功能,无论它是否具有RESTful性质。 Rails路由采用我提到的那些HTTP谓词,结合URI,并确定要调用哪个控制器。默认情况下,Rails遵循RESTful范例,按照惯例,将动词/ URI组合映射到您列出的那些操作 - 但是操作本身以及它们被集中到单个控制器中的事实不属于REST - 它们只是rails convention。

实际上,rails默认路由将4个不同的资源映射到该单个控制器及其操作:

/customers             // the list of all customers, GET/POST -> index/create
/customers/new         // a form for creating a customer, GET -> new
/customers/{id}        // a single customer, GET/PUT/DELETE -> show/update/destroy
/customers/{id}/edit   // a form for editing a customer, GET -> edit

资源可以包含子资源,Rails完全支持它。子资源可能是:

/customers/{id}/orders // the list of all orders for a particular customer

REST的另一个关键部分是它支持具有不同表示形式的资源,无论是HTML,XML,JSON等。客户端使用HTTP标头来传达他们传递给应用程序的表示(使用{{1} }标题)和(通常)他们将接受的响应(使用Content-Type标题)。

由应用程序决定资源表示是什么样的。通常,资源将是“瘦”或“胖”。 “瘦”资源是仅具有到其子资源的链接的资源,并且必须进一步调用以获取它们。 “胖”资源将包含它包含的完全充实的子资源。通常使用HTML表示,应用程序将返回某种形式的“胖”资源。没有什么非RESTful的 - 这正是您所描述的应用程序所需要的。

所以这是我漫长的说法“不要害怕通过显示子资源而不是RESTful - 这完全可以”: - )