| Blog信息 |
|
blog名称: 日志总数:1304 评论数量:2242 留言数量:5 访问次数:7645538 建立时间:2006年5月29日 |

| |
|
[Ruby on Rails]simply_restful in Rails Core 软件技术
lhwork 发表于 2007/2/8 10:37:22 |
| 现在 Rick 已把 simply_restful 插件集成到了 Rails 核心内, Rails 内的 RESTful 设计变得越来越有趣。我发现大多数文档是相当过时的,它的你为什么应该使用具名路由,url 生成等等介绍得很少。
一、URL 结构:
首先,这是大家熟悉的东西:URL 结构。有三个基本的URL ,但每一个都以不同的方式来应答各种 HTTP 动词。使用一个 Order 模型来说明:
---------------------------------------------------------------------------------
具名路由 URL HTTP 动词 控制器动作
----------------------------------------------------------------------------------
orders_url /posts GET index
orders_url /posts POST create
order_url /posts/:id GET show
order_url /posts/:id PUT update
order_url /posts/:id DELETE destroy
new_order_url /posts/new GET new
edit_order_url /posts/:id;edit GET edit
-------------------------------------------------------------------------------
复数形式的具名路由可以被认为是“集合” URL 。它允许在一个整体上操作集合:
1、得到所有条目清单,这个例子内是 orders (GET)
2、创建个新条目(POST)
换句话说,单数形式的具名路由被用于引用集合内的一个特定条目:在这个例子中是 post 。通过使用 GET,PUT,和 DELETE 动词,你可在这个条目上操作:
1、显示特定条目的属性(GET)
2、更新特定条目的属性 (PUT)
3、删除一个特定的条目 (DELETE)
这儿有两个“奇怪的”URL:’new’ 与 ‘edit’ 。它们被用于显示“create”与“update”URL的表单(通过适当的动词)。
二、设置 routes.rb 文件:
要把一个模型做为一个资源,对于可以按上面描述的方式进行管理的条目,你在 config/routes.rb 文件添加下面行:
ActionController::Routing::Routes.draw do |map|
map.resources :orders
end
可以同一行内指定多个资源,以减少混乱:
map.resources :orders, :invoices, :customers
资源也可以被嵌套,以产生类似的 URL如,/orders/1/invoices/3 :
map.resources :orders do |map|
map.resources :invoices
end
rescource 方法有一些可选参数,但我暂时先不讲…。
三、控制器:
有七个标准的控制器动作。下面以 Order 模型为例子:
class OrdersController < ApplicationController
def index
end
def show
end
def new
end
def create
end
def edit
end
def update
end
def destroy
end
end
这些样板代码足够应答所有的由 map.resources 调用定义的默认 URL 。
四、参数:
当请求单数的 URL 时,你可访问 params[:id] 变量内的的 ID。
Create 或 update 请求会让你通过访问 params[:entity_name] ,在一个 hash 内得到新属性。
当请求嵌套的 URL 时(如上面描述的),你可以访问基于模型名字的所有“父”ID。例如,如果你在定单内被嵌套的发票,像上面例子,你可在控制器内收到 params[:order_id]。
五、具名路由:
使用具名路由非常容易。假设有个 Order 模型,像以前一样,对于单数的 URL ,你可在 @order 变量内得到一个有效定单的实例,你可以链接各种控制器动作:
------------------------------------------------------
控制器动作 ---- 方法调用
--------------------------------------------------------
index ---- link_to orders_url
show ---- link_to order_url(@order)
new ---- link_to new_order_url
create ---- form_for :order, :url => orders_url, :html => { :method => :post }
edit ---- link_to edit_order_url(@order)
update ----- form_for :order, :url => order_url(@order), :html => { :method => :put }
destroy ---- link_to order_url(@order), :method => :delete
----------------------------------------------------------------
注意你可以直接传递你希望的实例给单数路由器。还要注意 :method 参数没有在具名路由中给出,相反它被传递给 link_to 或 form_for(或者是它们变体)。
具名路由对嵌套 resource 操作是一样的;你只需要传递“父”的 resource 做为第一个参数:
嵌套路由:
invoices_url(@order)
invoice_url(@order, @invoice)
http://david.goodlad.ca/articles/2006/08/02/simply_restful-in-rails-core |
|
|