假设我有一个客户和订单表,其中每个客户可能有许多订单。
由于在rails中我们鼓励以RESTful样式表示这些资源,我们的每个资源都将响应以下操作
到目前为止,这一切都非常公平公正。但是现在说每次打开我的客户的展示页面时,我想显示一个包含他/她的所有订单的详细信息表。
这是一个非常普遍的需要,但这不是“不干净”的宁静方法的正确性吗?
是否有一些解决方法,例如在“视图级别”将两个资源“混合”,使它们与其余观点分开?
答案 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。其中一些特征是:
GET
,POST
,PUT
,DELETE
等的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 - 这完全可以”: - )