`
dongbin
  • 浏览: 242478 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

也谈一下我对Rails 1.2中 Restful的理解

    博客分类:
  • Ruby
阅读更多
读了 http://www.iteye.com/topic/38653
想从代码方面谈一谈对Rails 1.2中的RESTful application 的感受。

我有User 和 Article两个Model,并且需要某一个User未读的所有Article。我的第一灵感就是声明一个has_and_belongs_to_many(好长的方法啊,每次都怕敲错)。

class User < ActiveRecord::Base
has_and_belongs_to_many :articles
end

class Article < ActiveRecord::Base
has_and_belongs_to_many :users
end



很简单是吧,那么Controller怎么写呢?

class UsersController < ApplicationController
  def add_unreaded
    @user.articles << @article
  end

  def remove_unreaded
    @user.articles.delete @article
  end
end


等一下,我这么写行不行呢?

class ArticlesController < ApplicationController
  def add_fresh_reader
    @article.users << @user
  end

  def remove_fresh_reader
    @article.users.delete @user
  end
end


这两种写法哪一个好呢?我踌躇,我犹豫,我翻来覆去睡不着觉。
... ...

如果把HTTP之上的所有请求都看成资源的操作的话。add_fresh_reader操作什么资源呢?提这个问题的同时,一个新model浮现了出来:Unreaded 。


class User < ActiveRecord::Base
has_many :articles, :through => :unreadeds
end

class Article < ActiveRecord::Base
has_many :users,:through => :unreadeds
end

class Unreaded < ActiveRecord::Base
end

class UnreadedsController < ApplicationController
  def create
    @unreaded = Unreaded.create(params[:unreaded])
  end

  def destroy
    @unreaded = Unreaded.find(params[:id])
    @unreaded.destroy
  end
end




又见到似曾相识的"create", "destroy"。 如果使用资源的方式思考,我们就会发现,CRUD is everything!

Constraints is Freedom

CRUD 形成了一种约束,把我们从权衡Controller和action风格这种无聊的事情中解脱出来,按照统一的风格来编写程序以及构造URL。使我们有精力关注更重要的事。

REST还避免我们编写大的Controller。可曾有人后悔曾经写过的包含十几个action的,并且action之间毫无联系的Controller呢? 其实大部分情况下,一个Controller有7个action就够了,并且这些action关注于同一Model,大大提高了正交性.

还有什么好处,欢迎大家补充。
分享到:
评论
6 楼 花花公子 2006-12-14  
你这篇和这一篇差不多,不过明显没有他讲的明白。而且明显他的例子更恰当些(用户可以有很多圈子,圈子里面也有很多用户)。
5 楼 dongbin 2006-12-13  
关于多对多关联关系是否应该是Model的问题,DHH的ppt讲得很好,推荐你读一下。

"user/123/unread/777"这个URL不是用来访问Article资源的。正确的写法是 /articles/id
而访问unreaded资源的URL是: /unreadeds/id
4 楼 花花公子 2006-12-13  
你难道没有意识到这是一个很严重的问题,这个时候未读文章并不是数据库直接的对象,而是一种关联关系。你这样做是为了restful而restful。

而且本身也不应该用restful解决。最起码不满足url不变性。我没有读过的文章,url/user/123/unread/777(123是我的id,777是文章的id,因为url不变性)。当我读过以后,这个url如何解释?
3 楼 qiezi 2006-12-13  
有道理。RESTful最核心的部分是“资源”,相关的部分是资源的定位(URI)以及资源的操作(CRUD),尽量把一些复杂的操作转化为CRUD。
2 楼 dongbin 2006-12-13  
花花公子 写道
楼主你的模型有问题吧,article和user通过unread关联,逻辑上有问题啊。读者和文档还可以有更多的关系的。

而且应该记录已读文章吧,假如有人新申请了帐号,你岂不是要把所有的文章都塞到他的未读文章里了?
你说的没错,有可能有其他关系,但是和Unreaded无关。如果还有其他关系就增加其他新的Models,不能够混在一起。

这个例子还没有涉及到你说的已读文章的需求。你可以在这个例子基础上增加需求来提一个更复杂的例子啊,欢迎补充。
1 楼 花花公子 2006-12-13  
楼主你的模型有问题吧,article和user通过unread关联,逻辑上有问题啊。读者和文档还可以有更多的关系的。

而且应该记录已读文章吧,假如有人新申请了帐号,你岂不是要把所有的文章都塞到他的未读文章里了?

相关推荐

    RestFul_Rails_Dev_v_0.1

    ### RestFul_Rails_Dev_v_0.1 关键知识点解析 #### 1. REST 概念与背景 REST(Representational State Transfer)是一种...在 Rails 中实现 RESTful 开发不仅可以提高开发效率,还能确保应用程序的一致性和可扩展性。

    应用Rails进行REST开发

    【RESTful Rails Development】 REST,全称为Representational State Transfer,是一种基于HTTP协议的设计原则,由Roy Fielding在其博士论文中提出。REST的核心思想是利用HTTP的GET、POST、PUT、DELETE等方法来操作...

    Rails2.0资料

    - **RESTful路由**:对RESTful路由进行了改进,使其更加符合REST原则,同时也更加易于理解和维护。 ##### 3.6 异常处理 - **异常处理**:Rails 2.0引入了`rescue_from`机制,允许开发者更优雅地处理异常,并可以...

    RESTful Web Service 课件下载.pdf

    Ruby on Rails自版本1.2起就内置了对REST的支持,这极大地简化了Web应用的开发过程。 - **RESTful路由**:通过定义路由,可以自动地为不同的HTTP动词映射到相应的控制器动作。 - **资源控制器**:每个资源都对应一...

    Ruby On rails依赖的目录树

    根据提供的标题、描述以及部分内容,我们可以清晰地了解到这段文本记录了一次安装Ruby on Rails及其...对于开发者来说,理解这些依赖库的工作原理及其如何集成到Rails中是非常重要的,这有助于更高效地进行Web开发。

    计算机项目,网站制作的毕业设计开题报告

    Ruby on Rails是遵循REST原则的开源Web开发框架,自1.2版本起,RESTful设计成为了其核心理念。Rails框架通过约定优于配置(Convention over Configuration)的原则,使得开发者能快速构建RESTful应用。本项目将运用...

    training_curriculum

    Ruby作为一种面向对象的、动态且强大的编程语言,因其简洁的语法和丰富的库支持,在Web开发领域尤其是Ruby on Rails框架中有着广泛的应用。 一、Ruby基础 1.1 Ruby介绍:学习Ruby的历史、特点以及它在软件开发中的...

    ASP EXCEL导入SQL

    Rails利用REST软件架构思想对网络服务也提供了一流的支持。从最直观的角度看待REST,它是网络服务最理想的手段,但是Rails框架把REST带到了网络应用软件开发框架。这是一次飞跃,让REST的思想从网络服务的应用提升到...

    毕业论文-基于Android的学生宿舍管理系统的实现.doc

    RESTful API设计原则要求API清晰、直观、易于理解。在本系统中,我们遵循以下规则: - 使用标准HTTP方法:GET用于检索信息,POST用于创建信息,PUT用于更新信息,DELETE用于删除信息。 - URL命名简洁明确,使用名词...

    Ruby学习思维导图.pdf

    - **RESTful 路由**:支持 RESTful 设计风格的 URL 结构。 **5.3 ActiveRecord** - **模型定义**:定义数据库表对应的类。 - **数据库迁移**:用于修改数据库结构的脚本。 - **关联**:定义模型之间的关系,如 `...

Global site tag (gtag.js) - Google Analytics