假设我有一个客户和一个订单表,其中每个客户可能有许多订单。
由于在 Rails 中,我们鼓励以 RESTful 风格表示这些资源,因此我们的每个资源都将响应以下操作
- 指数
- 节目
- 编辑
- 新的
- 创造
- 删除
到目前为止,这一切都非常公平和简单。但是现在说每次我打开客户的显示页面时,我都想显示一个包含他/她所有订单的详细信息表。
这是一个非常普遍的需求,但是这不是“不干净”的restful方法的正确性吗?
是否有一些解决方法,比如在“视图级别”“混合”这两个资源,让它们与其他观点分开?
假设我有一个客户和一个订单表,其中每个客户可能有许多订单。
由于在 Rails 中,我们鼓励以 RESTful 风格表示这些资源,因此我们的每个资源都将响应以下操作
到目前为止,这一切都非常公平和简单。但是现在说每次我打开客户的显示页面时,我都想显示一个包含他/她所有订单的详细信息表。
这是一个非常普遍的需求,但是这不是“不干净”的restful方法的正确性吗?
是否有一些解决方法,比如在“视图级别”“混合”这两个资源,让它们与其他观点分开?
Rails 的默认约定确保了一个 RESTful 应用程序,而这可能成为非 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 的默认约定。
您列出的那些操作并不是 RESTful 的原因。必须将应用程序视为 RESTful 的一系列特征。其中一些特征是:
GET
, POST
, PUT
,DELETE
等。Rails 负责通过路由接收 HTTP 请求并调用应用程序的功能,无论其本质上是否为 RESTful。Rails 路由将我提到的那些 HTTP 动词与 URI 结合起来,并确定要调用哪个控制器。默认情况下,Rails 遵循 RESTful 范式,并且按照惯例,会将动词/URI 组合映射到您列出的那些动作 - 但动作本身,以及它们被集中到单个控制器中的事实,并不是 REST 的一部分 - 它们只是轨道公约。
事实上,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 标头来传达他们正在传递给应用程序的表示形式(使用Content-Type
标头)和(通常)什么他们将接受响应(使用Accept
标题)。
由应用程序决定资源表示的样子。通常,资源要么是“瘦”的,要么是“胖”的。“瘦”资源是一种仅具有指向其子资源的链接并且必须进行进一步调用才能获取它们的资源。“胖”资源将包含它所包含的完整子资源。通常使用 HTML 表示,应用程序将返回某种形式的“胖”资源。没有什么是非 RESTful 的 - 这正是您所描述的您想要的应用程序。
所以这就是我所说的“不要害怕通过显示子资源而不是 RESTful - 这完全没问题” :-)