`
mypages
  • 浏览: 90330 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

应用Rails进行REST 开发(三)

阅读更多

REST 风格的URL 和View
View是系统界面和用户之间的一个表现,用户通过链接和按钮来和系统进行交互。传统上Rails的开发人员使用 link_to 这个helper 方法来构造一个链接,这个方法需要一个 hashmap, hashmap 由 controller 和 action 组成;此外,还可以传递一些其他的参数。例如:
    link_to :controller => "projects", :action => "show", :id => project
    =>
    <a href="/projects/show/1">Show</a>

我们马上就意思到,这个link_to 方法并不能很好的用于我们的REST思想:REST不会在URL里包含action。
那么重要的就是通过链接和按钮,我们要把 http 协议的4个动作和URL一起传递给服务器。所以,我们会看到Rails的改进之处:我们仍然使用 link_to 去创建链接,但是,我们不会再使用hashmap, 而是使用一个“path”的方法。首先用一个例子,来说明如何创建一个链接去调用 controller 的 show action。请看好,我
们不会再使用 controller, action, 和 id 了:

    link_to "Show", project_path(project)
    =>
    <a href="/projects/1">Show</a>

关于 path 和下面要说的url 这两类helper 方法,请大家千万不要疑惑他们是从哪来的。我们可以这么认为,是Rails 动态地创造了他们。我们只要使用就可以了!

传统的link_to 所生成的链接中包含了controller和action,相对比,使用新的 “project_path” 所创建的链接,只包含了controller 和 资源的id –毫无疑问,这是一个 REST风格的URL。因为链接默认的是一个“Get”请求,Rails 能够知道这一点,所以就会去调用 show action。对于每一个资源,rails 都会有7个标准的 path 方法,这些可以从表1.2中看到。

每一个path 方法都关联一个 http 协议的动作,一些请求(例如show,create),可以通过http协议的 Get 或 Post 传递给服务器;但是有一些请求,如 update,delete,则需要一些其他的方式(如使用隐藏的变量)传递给服务器,因为浏览器并不知道 PUT和DELETE动作。接下来的章节我们会仔细的介绍。

进一步看看这个表,我们也会发现4个http 动作,并不足以包含全部的CRUD操作。前2个方法使用Get的方式会工作的很好,但是对于new_project_path 和 edit_project_path 就不同了。

New 和 Edit
用户如果点击一个“新建”链接,那么会使用Get动作来对服务器发送一个请求。下面的例子表明,生成的链接是由 controller 和一个“new”action 组成的。

link_to "New", new_project_path
=>
<a href="/projects/new">New</a>

这是对REST思想的一种破坏?或许乍看之下确实如此。但是如果你仔细看,那么一切都会清晰,“new”并不是一个CURD的action,它更像一个建立一个新的资源之前的准备的动作。真正的CRUD 中的create被调用,是在新的form被提交的以后才执行的。这个链接当然也没有资源的id—因为资源还没有被创建。一个链接如果没有资源的id,那么就不应该被称为REST的URL,因为REST的URL总是会指定一个资源的id。所以,这个 “new” action 仅仅因该用来显示一个新的form的页面而已。

对于 edit_project_path ,也是同样的道理。它引用了一个资源,但是仅仅是在调用 update action 之前的准备工作。真正的update action 是在页面被提交以后才执行的。edit_project_path 和 new_project_path 唯一的区别就是前者需要使用一个资源的id。按照REST的规则,资源的id放在controller 的后面:/project/1 。但是如果仅仅使用Get 动作来提交这个URL,那么Rails将会认为你要调用的是show action。为了防止这一点,edit_project_path 方法扩展了一下生成的链接,例如:

link_to "Edit", edit_project_path(project)
=>
<a href="/projects/1;edit">Edit</a>

这样,我们就能理解为什么允许 edit_project_path 和 new_project_path生成的链接里带有 action 了,因为他们两个都不是REST的 CRUD URL,他们仅仅是准备工作。还有其它的一些URL和这两个很相似,我们会在后面的章节介绍。

在 form 中使用 path 方法:Create 和 Update
传统的方式上,我们使用 form_tag 或 form_for 来创建一个form:

<% form_for :project, @project, :url => { :action => "create" } do |f|
%>
...
<% end %>

在REST应用中,这个 :url hashmap 会被 path 方法给取代:

“project_path” 创建新的资源所使用的form
“project_path(:id)”编辑一个资源所使用的form

a) 创建资源所使用的form
form 使用 post 动作向服务器提交信息,“project_path”方法并不会有资源id作为参数,这样,生成的URL就应该是“/projects”这个样子。当提交到服务器以后,就会调用 create action。

form_for(:project, :url => projects_path) do |f| ...
=>
<form action="/projects" method="post">

b) 编辑一个资源所使用的form
按照REST的思想,一个更新的操作是使用http协议的PUT动作来发送的。但是,正如我们所知道的,浏览器只明白 Post和Get动作。解决的办法就是使用

form_for 方法里的 :html 参数。
form_for(:project, :url => project_path(@project),
:html => { :method => :put }) do |f| ...
=>
<form action="/projects/1" method="post">
<div style="margin:0;padding:0">
<input name="_method" type="hidden" value="put" />
</div>

Rails 生成了一个隐藏的字段来代替http的put 动作。提交以后,Rails 会检查这个变量,然后判断是否去调用update方法。

删除
恐怕我们已经发觉了,用于显示和删除一个资源,所使用的path方法都一样:

link_to "Show", project_path(project)
link_to "Destroy", project_path(project), :method => :delete

唯一的不同就是 删除的时候,使用了一个变量 :method,用它来表示http的DELETE动作。因为浏览器不支持DELETE动作,所以,Rails 会生成一些javascript来解决这个问题:

link_to "Destroy", project_path(project), :method => :delete
=>
<a href="/projects/1"
onclick="var f = document.createElement(’form’);
f.style.display = ’none’; this.parentNode.appendChild(f);
f.method = ’POST’; f.action = this.href;
var m = document.createElement(’input’);
m.setAttribute(’type’, ’hidden’);
m.setAttribute(’name’, ’_method’);
m.setAttribute(’value’, ’delete’); f.appendChild(m);f.submit();
return false;">Destroy</a>

这段javascript 会生成一个form,把 http 的DELETE动作放在隐藏变量里传递给服务器,然后,Rails 会判断这个变量,决定是否去调用destroy 方法。

好了,今天就介绍到这,明天我们来说说Controller中的URL方法。

分享到:
评论

相关推荐

    应用Rails进行REST开发

    ### 应用Rails进行REST开发 #### 1.1 什么是REST? REST(Representational State Transfer),这是一种由Roy Fielding在他的博士论文中提出的架构风格。REST的核心思想是通过标准HTTP协议中的GET、POST、PUT、...

    Web开发敏捷之道-应用Rails进行敏捷Web开发(第3版).pdf

    《Web开发敏捷之道:应用Rails进行敏捷Web开发(第3版)》:Ruby on Rails是一个全套的MVC web框架,它能帮你开发高质量又美观的web应用,而且开发速度快得出乎你想象。你只须集中精力于应用程序本身,Rails就会帮你...

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    在本篇内容中,我们将深入探讨如何利用Ruby on Rails(简称Rails)这一强大的Web应用程序框架来构建可伸缩且易于维护的RESTful API。Rails以其简洁优雅的语法、高效的开发速度以及良好的社区支持而闻名,这使得它...

    应用Rails进行敏捷Web开发 第三版(doc格式)

    《应用Rails进行敏捷Web开发 第三版》是关于Ruby on Rails框架的一本经典教程,针对的是Web开发领域的专业人士。Rails是一种流行的开源Web应用程序框架,它基于Ruby编程语言,旨在简化和加速Web应用的开发过程,强调...

    应用Rails进行敏捷Web开发

    ### 应用Rails进行敏捷Web开发:探索框架的精髓与敏捷的魅力 Rails,全称Ruby on Rails,是由David Heinemeier Hansson创建的一种基于Ruby语言的开源Web开发框架。自诞生以来,Rails以其独特的魅力迅速席卷了Web...

    使用rails编写REST风格的web应用

    Rails,全称Ruby on Rails,是一款基于Ruby语言的开源Web应用程序框架,遵循MVC(Model-View-Controller)架构模式,特别适合快速开发RESTful(Representational State Transfer,表述性状态转移)风格的Web应用。...

    应用Rails进行敏捷Web开发(第2版)

    《应用Rails进行敏捷Web开发(第2版)》是一本深度探讨如何利用Ruby on Rails框架进行高效、敏捷的Web应用程序开发的专业书籍。Rails是Ruby语言的一个开源Web开发框架,它倡导DRY(Don't Repeat Yourself)原则,强调...

    使用rails编写REST风格的web应用.pdf

    标题与描述均指向了"使用Rails编写REST风格的Web应用"这一主题,这是一份深入探讨如何运用Ruby on Rails框架来构建遵循REST(Representational State Transfer)架构风格的Web应用程序的指南。REST作为一种架构风格...

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    相比第2版中的内容,Rails 2增加了REST、资源、轻量级web service等新特性。本书涵盖了这些全新的内容,因此能更好地体现出Rails框架的发展现状。 整体而言,全书既有直观的实例,又有深入的分析,同时还涵盖了web...

    跨越边界:REST on Rails

    随着Ruby的经验不断成功,开发人员开始寻求把他们的Ruby应用程序与用其他语言编写的应用程序集成。Rails对Web服务提供了优秀的支持。本文介绍Rails中的Web服务,重点放在一个名为Representational State Transfer ...

    Rails101_by_rails4.0

    Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它遵循模型-视图-控制器(MVC)的架构模式,设计用来快速开发数据库驱动的动态网页。随着Rails版本的更新迭代,此书聚焦于一个特定的版本,帮助...

    The Rails 4 Way

    - **启动和应用设置**:这部分介绍如何配置Rails项目的启动过程以及如何设置各种环境变量,包括开发、测试和生产环境的差异配置。 - **不同模式下的配置**: - **开发模式**:通常包含更多的调试信息和详细的错误...

    rails本地安装包完整版

    它允许Rails应用作为客户端,通过HTTP与遵循REST原则的远程资源进行交互,从而实现数据的获取和更新。 5. **rake-0.8.1.gem**:Rake是Ruby社区广泛使用的构建工具,类似于Java的Ant或Python的setup.py。它允许...

    好用的rails 2.0 Api 文档

    Rails鼓励使用REST(Representational State Transfer)架构风格来构建Web应用。RESTful路由允许开发者通过HTTP动词(GET、POST、PUT、DELETE等)来定义资源的操作,使URL更加语义化,提高可读性和可维护性。 **4. ...

    Agile Web Development With Rails第三版

    《Agile Web Development with Rails》第三版是一本深入探讨使用Ruby on Rails进行敏捷网页开发的专业书籍。这本书在Web开发领域享有盛誉,以其详尽的教程、实用的示例和全面的指导闻名。Ruby on Rails(简称Rails)...

    Rails的精简版本Rails::API.zip

    Rails::API 是 Rails 的精简版本,针对不需要使用完整...也可以用来编写在 Web 应用和客户端之间进行数据共享的后端程序,允许开发者创建接受 JSON 格式数据并以传统 RoR 应用方式存储的REST端点。 标签:rails

Global site tag (gtag.js) - Google Analytics