rails的REST特性简记

1.关于REST的URL的详细讨论,参见《RESTful Rails development》文档,这里有中文翻译。Path-Methods对照表:

2.在Controller和View中新增加了一些helper方法,URL路由的设置来自config目录下的routes.rb中的一行代码:

 map.resources :projects

这行代码将自动产生用于Controller的系列url方法和用于View的系列Path方法,对照表
路由             产生的Helper
-----------------------------------------------------------
projects       projects_url, projects_path
project        project_url(id), project_path(id)
new_project    new_project_url, new_project_path
edit_project   edit_project_url(id), edit_project_path(id)

3.路由的定制,通过下面的选项来定制符合个人需要的路由规则:

:controller.   设置使用的Controller.
:path_prefix.  URL前缀.
:name_prefix.  用于设置产生的helper方法的前缀 
:singular. To name the singular name to be used for the member route.

4.Nested Resource(嵌套资源乎?),当rails采用REST架构时如何处理过去的Model之间的关联关系,比如1:N?比如以文档中的例子来说明,一个project可能有多个iteration,典型的一对多关系,我们在产生Model后,与传统rails一样,设置关联关系:

class Project < ActiveRecord::Base
  has_many :iterations
end

class Iteration < ActiveRecord::Base
  belongs_to :project
end

1)既然是REST架构,那么路由改如何设置呢?或者说我们该怎么访问某个project的所有itration呢?直观的感觉应该是http://localhost:3000/project/:project_id/iterations,那么可以这样修改routes.rb,把生成的

map.resources :iterations

修改为:

map.resources :projects do |projects|
   projects.resources :iterations
end

将自动产生如下格式的路由:

/project/:project_id/iterations
/project/:project_id/iterations/:id

2)接下来,应当修改IterationsController的增、改、查action了,因为要关联project对象,在Controller中可以通过params[:project_id]获取该iteration所在的project。比如修改index action:

def index
  project = Project.find(params[:project_id])
  @iterations = project.iterations.find(:all)
  respond_to do |format|
     format.html # index.rhtml
     format.xml { render :xml => @iterations.to_xml }
  end
end

3)相应的iteration的Controller和View的Url和Path等helper都增加了一个参数,他们的第一个参数都将是project_id,比如

<%= link_to "Show",iteration_path(iteration.project,
iteration) %>

<%= link_to "Edit", edit_iteration_path(iteration.project,
iteration) %>

同样,所有form_for指向的url的helper也都增加了这个参数。总结一句话,被嵌套类(这里的iteration)的所有helper都增加一个参数并且是第一个参数——外包类(这里的project)的id

5.自定义action,对于不能归结为crud操作的action,我们需要自己定义action,已经说过,REST把所有的远程调用抽象为对远程资源的CRUD操作,非CRUD操作应当转化或者说抽象成CRUD操作,比如对于project可以有一个关闭操作close,我们可以把它理解成一个http POST请求去修改project的closed字段为true,这样一来这个操作也可以当作CRUD操作了。需要做的是在routes.rb增加一行:

map.resources :projects, :member => { :close => :post }

定义close action是POST方法,在Controller增加close方法:

def close
   respond_to do |format|
      if Project.find(params[:id]).update_attribute(:closed, true)
       flash[:notice] = "Project was successfully closed."
       format.html { redirect_to projects_path }
       format.xml { head :ok }
     else
       flash[:notice] = "Error while closing project."
       format.html { redirect_to projects_path }
       format.xml { head 500 }
     end
   end
end

你可以通过http://localhost:3000/project/:project_id;close来调用此方法,请注意,POST的方法需要通过Form来实现,因此我们使用button_to:

<td><%= button_to "Close", close_project_path(project) %></td>

自定义action不仅仅可以使用REST风格,传统的controller/action/id的方式仍然可以使用,注意下routes.rb的最后两行即可。

6.自定义格式,rails支持的格式有:

respond_to do |wants|
  wants.text
  wants.html
  wants.js
  wants.ics
  wants.xml
  wants.rss
  wants.atom
  wants.yaml
end

自定义格式需要在config/environment.rb中增加一行进行注册,比如pdf格式?

Mime::Type.register "application/pdf", :pdf

当然,你需要实现自己的to_pdf方法了

7.在rails1.2中使用AJAX与过去没有什么不同,仅仅是页面调用的URL全部改成新增加的那些Path helper

8.激动人心的ActiveResource,目前还未正式加入rails1.2,值的期待,简单来说就是就是通过这个库你将可以使用所有按照REST实现的web APIS,操作远程的资源将和操作本地的ActiveRecord一样。

《RESTful Rails Development》下载

文章转自庄周梦蝶  ,原文发布时间5.17

时间: 2024-10-22 10:09:18

rails的REST特性简记的相关文章

Ruby on Rails需要知道的12点知识

为什么Ruby on Rails之于应用开发,就好比苹果之于桌面OS? 1.Ruby on Rails的优化首先是为人,其次才是编辑器和框架: 2.Ruby on Rails为Web开发提供了一个相当吸引人的新的选择: 3.Ruby on Rails虽然来源于标准的方法和模式,但它开辟了软件开发的新方法: 4.Ruby on Rails只需要较少的软件,却提供了完整的开源框架和丰富的社区支持: 5.Ruby on Rails是提供full-stack framework的一种尝试,通过model

跨越边界: Streamlined,第1部分

我生平首次参加马拉松培训.马拉松培训最有趣的方面--实际上,也是惟一的方面--就是提高不 断叠加所带来的影响.有时,我为了提高效率而进行专门为了改进身体条件而设计的长短跑.有时,在跑 步过程中,我学习避免小的错误,避免重复多余的姿势(多余的姿势对单个步幅没有太大影响,但却会在 整个 26.2 英里的跑步过程中浪费能量或伤害到我).我每周都有提高,可每周之间的区别并不显著.但 是一个训练计划周期过后,我会从最初只能跑 4 英里提高到能跑 26.2 英里.软件开发也与此类似.如 果持续进行小的改进,

Ruby on Rails 2.0的新特性介绍

万众瞩目的Ruby on Rails 2.0已经发布了,Rails框架在2004年诞生以来,一直保持着相当快的版本 升级速度:2005年发布了Rails1.0版本,2006年初发布Rails1.1版本,2007年初发布Rails1.2版本,而还 没有等到2008年,在2007年圣诞前夕的12月6日,Rails2.0已经发布. Rails框架每个大的版本升级都给我们带来了相当多的新功能,新惊喜.Rails1.0带给我们完善的单元 测试和集成测试:Rails1.1带给我们DataBase Migra

jQuery 1.4官方文档详细讲述新特性功能

为了庆祝jQuery的四周岁生日, jQuery的团队荣幸的发布了jQuery Javascript库的最新主要版本! 这个版本包含了大量的编程,测试,和记录文档的工作,我们为此感到很骄傲. 我要以个人的名义感谢 Brandon Aaron, Ben Alman, Louis-Rémi Babe, Ariel Flesler, Paul Irish, Robert Kati?, Yehuda Katz, Dave Methvin, Justin Meyer, Karl Swedberg, and

Rails系统中的AJAX开发技术简析(2)

ajax|rails 五. 使用link_to_remote Rails有若干帮助者方法以在你的视图的模板中实现Ajax.一种最简单且很通用的方法就是link_to_remote().让我们考察一个简单的web页面-它实现询问时间并且有一个链接,用户可以点击这个链接来获得当前的时间.该应用程序经由link_to_remote()使用Ajax以检索时间并且显示它于web页面. 我的视图模板(index.rhtml)看起来象: <html><head><title>Ajax

Rails系统中的AJAX开发技术简析

ajax|rails 一. Ajax的简短历史 在短短几个月内,Ajax从一种十分模糊稀罕的技术一下变成最热门的东西.本文将介绍极其容易使用的Ajax支持-作为Ruby on Rails web应用程序框架的一部分实现. 本文不是一个详细的教程,所以我假定你已经了解一点关于如何组织和构建一个Rails web应用程序的知识. 最开始出现的是万维网.比较于桌面应用程序,web应用程序相当缓慢和沉闷.无论如何,人们都喜欢上了web应用程序,因为他们无论在什么地方都能上网,只要身边的计算机上安装一个浏

Rails系统中的AJAX开发技术简析(1)

ajax|rails 一. Ajax的简短历史 在短短几个月内,Ajax从一种十分模糊稀罕的技术一下变成最热门的东西.本文将介绍极其容易使用的Ajax支持-作为Ruby on Rails web应用程序框架的一部分实现.本文不是一个详细的教程,所以我假定你已经了解一点关于如何组织和构建一个Rails web应用程序的知识. 最开始出现的是万维网.比较于桌面应用程序,web应用程序相当缓慢和沉闷.无论如何,人们都喜欢上了web应用程序,因为他们无论在什么地方都能上网,只要身边的计算机上安装一个浏览

通过一个Java应用服务器使用JRuby on Rails和XML增强Ajax

Ruby on Rails 框架提供了一些非常方便的 XML 特性,这使使用数据库数据 进行开发和为 JavaScript 应用程序提供 XML 格式的数据库数据变得更加简单 .JavaScript 还具有内置的 XML 解析功能,因此可以非常轻松地接收和解析 XML 格式的数据.但是,如果要在不部署额外服务器的情况下接入 Java 应用程序,该如何做呢?这正是 JRuby 的工作.JRuby on Rails 是 Ruby on Rails 框架的 Java 实现,通过将 Ruby 应用程序部

面向企业的Ruby on Rails

曾有开发者预言,Rails不可能成为企业应用的主流.但随着Rails在Web开发中的逐渐普及与流行,越来越多的企业开始在Rails上面投入更多关注,同时面向企业复杂业务逻辑开发的Rails应用也逐步出现. 诚然,在Web 2.0网站开发中无往不利的Ruby on Rails(简称ROR)完全适应企业应用,但是仍然还需要走很长的路.不可否认,尽管Rails在企业开发中依然是优势与弊端并存,却已在部分成功案例中显露出锋芒. Rails与传统企业开发语言 随着科学技术的不断更新,企业IT系统也一直向着