`
世说新语
  • 浏览: 23386 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Restful让我束手束脚

阅读更多

在Rails中View+Controller+Helper是紧耦合的,Controller中的方法与相关目录下的view template一一对应;Model+Migration+DB是紧耦合的。这2大块之间是松耦合的。


这2块的内部组织方式是完全不同的:

对于Model层,我们通常会对业务进行OO分析,提取出一些名词和名词之间的关系,然后把他们映射成Model,这个过程比较直观,是相对细粒度的。

对于View层,我们要考虑的是用户怎么用着舒服,为了用户的方便,页面可能很简单,也可能很复杂,一个页面可能包含多个Form,一个Controller也可能调用多个Model的功能对view提供支持,它是对Model的一个全新的组织,是相对粗粒度的。我们有可能把几个相互关联的Model组织到同一个View+Controller里面集中的向用户展示。



 如果没有Restful,一切工作的很好,URL我爱怎么写就怎么写,全看个人习惯。但是现在Restful来了,一句 map.resources 给了我们7个URL。看看这个

map.resources :articles

 

问题是这句话假定我们有一个名为ArticlesController的控制器,这无形中把ArticlesController的功能限制为对某一项资源的CRUD。


<!----><!----> <!---->

想象一下这个场景,我要录入一篇Article,然后查询系统中已有的author(作者),把这篇artile与某个author关联起来。也就是在Add an article页面还要添加search author的功能,OK,问题来了,search_author这个方法我放哪?ArtilesController吗?你得自己添加map.connect,这似乎违反了restfulArtilesController要处理另外一个资源的CRUDAuthorsController吗?AuthorsController怎么关联到别的Controllerview? Controller是不是一定要和View一一对应?

 



<!----><!----><!---->

我觉得应该是我对restful的理解还不够深入,但至少现在我觉得restful给我带来严重的限制。

 

  • 大小: 249.1 KB
  • 大小: 13.9 KB
分享到:
评论
8 楼 世说新语 2008-12-08  
<div class='quote_title'>liusong1111 写道</div>
<div class='quote_div'>map.resources :articles 就是几行map.connect语句的简写,用map.resources :articles, :collection =&gt; {:search_by_author =&gt; :get}进行扩展,rails书或rails REST cheatsheet上都有写.<br/>如果你觉得search应该作为一个资源,就建立一个新的controller并用resources声明到routes里.</div>
<p> </p>
<p>这是针对我的问题的一个比较现实的解决方案,我现在用的就是这个。但是这个方案也有问题,它背后隐含着依然是Controller与Model一一对应的组织方式,在一个Controller中对另一种Model的访问被作为特例来处理。不是我认同的Controller与Model相互独立的组织方式。</p>
<p> </p>
<p>另外关于把Searches抽象为资源的方式已经超出了我的理解范围,把的动词作为资源的做法我还无法接受。</p>
<p> </p>
<p>究竟哪种是最佳实践?在DocumentsController中写search_author方法?还是所有涉及Author访问(包括相关的view templates)的都必须在AuthorsController中?假如我的系统里针对author除了search之外没有别的CRUD的操作,难道我也一定要建一个AuthorsController专门处理这个search_author请求吗?如果一个页面涉及到多个Model(因此会由多个partial template组成),那页面代码是不是要被割裂在不同的View目录下,Views/document,Views/author . . . . . 。2种代码的组织方法都行得通,但我相信还是有优劣之分的。</p>
<p> </p>
<p>rails网站上最新的15分钟创建blog视频采用的是我不太认同方式,Post和comment两个model,对post的CRUD都在PostsController中进行,对commmet的CRUD都在CommentsController中进行。这个“半官方”的视频让我对自己的观点不太自信。希望大家多多发言,把这个事整明白。</p>
7 楼 liusong1111 2008-12-08  
map.resources :articles 就是几行map.connect语句的简写,用map.resources :articles, :collection => {:search_by_author => :get}进行扩展,rails书或rails REST cheatsheet上都有写.
如果你觉得search应该作为一个资源,就建立一个新的controller并用resources声明到routes里.
6 楼 foxgst 2008-12-08  
<div class='quote_title'>liuqiang 写道</div>
<div class='quote_div'>
<div class='quote_title'>世说新语 写道</div>
<div class='quote_div'>
<p><span style='font-size: small;'>我不太同意楼上的看法,这也是我对restful困惑的主要的地方。<br/>如果按照restful,那就是一个controller里面包含某<span style='color: #ff0000;'><span style='background-color: #ffffff;'>一项</span></span>资源的CRUD,<span style='color: #ff0000;'>那就相当于人工的把controller和Model一一对应起来了,如果这样的话,controller和Model之间还是松耦合的吗?</span>我的看法是Model层和Controller+View的组织方式应该是完全不同的,或者说Controller+View应该如何来组织完全取决于展示逻辑并且独立于Model。</span></p>
<p>我觉得restful只是一个写url的规范<span style='font-size: small;'>,原来只是简单的url,现在则是动词+url,他不应该影响到我的代码的组织。<br/>Controller应该是个矮胖子,说它矮的意思是他应该包含尽量少的业务逻辑,把业务逻辑尽量的往Model推。说他胖的意思是他应该完全按照展示逻辑来组织。页面简单,Controller也简单,页面复杂,Controller也可以跨越或调用多个Model的功能。</span></p>
<p> </p>
</div>
<p>把searches抽象为一个资源如何</p>
<p> </p>
<p>你把尽可能多的东西抽象成资源(<span style='font-size: small;'>CRUD</span>),那么<span style='font-size: small;'>Controller就很精简了</span></p>
<p> </p>
<p> </p>
</div>
<p> </p>
<p>呵呵,这让我想到了元数据和数据元。</p>
5 楼 foxgst 2008-12-08  
@世说新语

我觉得这里你要正确理解一项资源的概念,这里的资源不是不可分割的对象。

比如,我们可以在创建文章的时候加入一个作者,作者作为文章的一个相关资源

a = Article.new(:title=>'How to study ROR', :subtitle=>'what is important')
a.authors.build(:name=>'SOMEONE')
a.save


我们也可以创建作者的时候,输入他写的一篇文章
a = Author.new(:name=>'SOMEONE')
a.articles.build(:title=>'How to study ROR', :subtitle=>'what is important')
a.save
4 楼 liuqiang 2008-12-08  
<div class='quote_title'>世说新语 写道</div>
<div class='quote_div'>
<p><span style='font-size: small;'>我不太同意楼上的看法,这也是我对restful困惑的主要的地方。<br/>如果按照restful,那就是一个controller里面包含某<span style='color: #ff0000;'><span style='background-color: #ffffff;'>一项</span></span>资源的CRUD,<span style='color: #ff0000;'>那就相当于人工的把controller和Model一一对应起来了,如果这样的话,controller和Model之间还是松耦合的吗?</span>我的看法是Model层和Controller+View的组织方式应该是完全不同的,或者说Controller+View应该如何来组织完全取决于展示逻辑并且独立于Model。</span></p>
<p>我觉得restful只是一个写url的规范<span style='font-size: small;'>,原来只是简单的url,现在则是动词+url,他不应该影响到我的代码的组织。<br/>Controller应该是个矮胖子,说它矮的意思是他应该包含尽量少的业务逻辑,把业务逻辑尽量的往Model推。说他胖的意思是他应该完全按照展示逻辑来组织。页面简单,Controller也简单,页面复杂,Controller也可以跨越或调用多个Model的功能。</span></p>
<p> </p>
</div>
<p>把searches抽象为一个资源如何</p>
<p> </p>
<p>你把尽可能多的东西抽象成资源(<span style='font-size: small;'>CRUD</span>),那么<span style='font-size: small;'>Controller就很精简了</span></p>
3 楼 世说新语 2008-12-08  
<p><span style='font-size: small;'>我不太同意楼上的看法,这也是我对restful困惑的主要的地方。<br/>如果按照restful,那就是一个controller里面包含某<span style='color: #ff0000;'><span style='background-color: #ffffff;'>一项</span></span>资源的CRUD,<span style='color: #ff0000;'>那就相当于人工的把controller和Model一一对应起来了,如果这样的话,controller和Model之间还是松耦合的吗?</span>我的看法是Model层和Controller+View的组织方式应该是完全不同的,或者说Controller+View应该如何来组织完全取决于展示逻辑并且独立于Model。</span></p>
<p>我觉得restful只是一个写url的规范<span style='font-size: small;'>,原来只是简单的url,现在则是动词+url,他不应该影响到我的代码的组织。<br/>Controller应该是个矮胖子,说它矮的意思是他应该包含尽量少的业务逻辑,把业务逻辑尽量的往Model推。说他胖的意思是他应该完全按照展示逻辑来组织。页面简单,Controller也简单,页面复杂,Controller也可以跨越或调用多个Model的功能。</span></p>
<p> </p>
2 楼 gigix 2008-12-07  
foxgst 写道
你说的这个需求和Restful还真的不矛盾。

search author的功能放在AuthorsController里。

Add an article的时候,通过ajax方式请求author功能就可以了。


正解
根本就不应该有“Search Author”这么个按钮,一边输入一边就搜索了
1 楼 foxgst 2008-12-07  
你说的这个需求和Restful还真的不矛盾。

search author的功能放在AuthorsController里。

Add an article的时候,通过ajax方式请求author功能就可以了。

相关推荐

    Java Restful Web 源代码,Java Restful Web 源代码

    Java Restful Web 源代码Java Restful Web 源代码Java Restful Web 源代码Java Restful Web 源代码Java Restful Web 源代码Java Restful Web 源代码Java Restful Web 源代码Java Restful Web 源代码Java Restful Web...

    C# 一个简单的 Restful 服务端和 Restful 客户端 Demo

    本示例是关于如何使用C#语言创建一个简单的RESTful服务端以及对应的RESTful客户端。以下是相关知识点的详细说明: 1. **RESTful原则**:REST(Representational State Transfer)的核心思想是资源(Resource)和...

    谷歌浏览器restful请求插件

    **谷歌浏览器RESTful请求插件** 谷歌浏览器RESTful请求插件是开发人员在进行Web API测试、调试和接口文档编写时的重要工具。它允许用户直接在浏览器中发起HTTP请求,包括GET、POST、PUT、DELETE等RESTful操作,极大...

    restful接口文档模板

    ### RESTful接口文档模板知识点解析 #### 一、RESTful接口概述 REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,可以使用XML或者JSON格式传输数据,一般用于...

    restful接口示例代码

    RESTful接口是一种遵循REST(Representational State Transfer,表述性状态转移)架构约束的Web服务设计风格,用于构建可扩展、高性能的互联网应用程序。REST强调通过HTTP协议中的动词(GET、POST、PUT、DELETE等)...

    restful 接口开发规范(RESTfulAPIdesignguide)

    在开发RESTful接口时,我们需要遵循一定的设计规范来确保接口的一致性、可维护性和易用性。RESTful API(Representational State Transfer,也称为RESTful web服务)是一种提供互联网计算机系统间互操作性的方法。...

    c# 服务端调用RestFul Service的方法

    ### C# 服务端调用 RestFul Service 的方法 #### 概述 本文档将详细介绍如何使用 C# 创建和调用 RESTful ...当然,实际应用中可能还会涉及到更多的细节和技术优化,但本文提供的基础内容已经足够让初学者入门并实践。

    Python Flask高级编程之RESTFul API前后端分离精讲第七章节

    Python Flask高级编程之RESTFul API前后端分离精讲第六章节Python Flask高级编程之RESTFul API前后端分离精讲第六章节Python Flask高级编程之RESTFul API前后端分离精讲第六章节Python Flask高级编程之RESTFul API...

    httpclient和RestfuL风格上传下载文件

    在Java开发中,HTTPClient和RESTful风格的接口被广泛用于实现文件的上传与下载功能。HTTPClient是一个强大的HTTP客户端库,而RESTful是一种轻量级的、基于HTTP协议的软件架构风格,常用于构建Web服务。在分布式系统...

    Restful C# 服务端篇之实现RestFul Service开发(简单实用)

    在IT行业中,RESTful(Representational State Transfer)是一种软件架构风格,用于设计网络应用程序,尤其在Web服务领域广泛应用。C#作为.NET框架的主要编程语言,提供了丰富的工具和技术来实现RESTful服务。本篇...

    .NET 作为客户端调用WEBAPI RESTFUL服务端以及如何开发RESTFUL服务端用于客户端调用

    首先,让我们了解一下客户端如何使用.NET调用WebAPI RESTful服务端。这通常涉及以下几个步骤: 1. 创建HTTP客户端:可以使用HttpClient类,它是.NET Framework和.NET Core中的标准HTTP客户端。实例化一个HttpClient...

    restFul.Net

    Restful.NET是一个基于.NET框架实现RESTful架构风格的Web服务开发工具。REST(Representational State Transfer,表述性状态转移)是一种轻量级的、基于HTTP协议的软件架构风格,广泛应用于现代Web服务的设计中。...

    restful2个例子

    首先,让我们了解RESTful的基本原则: 1. **资源(Resources)**:在RESTful中,每个URL都代表一个资源。例如,`/users/1`表示用户ID为1的用户资源。 2. **状态转移(State Transfer)**:客户端通过HTTP方法(GET,...

    C#服务端RestFul Service-经验案例.doc

    C#服务端RestFul Service开发经验案例 本文档介绍了如何使用C#语言创建服务端RestFul Service接口,并提供了详细的代码说明,方便用户学习和深入掌握。该经验案例主要讲解了如何使用RestFul数据访问方式将装备软件...

    Spring CXF Restful 实例

    首先,让我们了解REST的基本原则。RESTful API通常基于HTTP协议,通过GET、POST、PUT、DELETE等HTTP方法来操作资源。在Spring CXF中,我们可以轻松地定义这些资源和操作,实现RESTful服务。 1. **配置Spring CXF**...

    restful restful所需要的jar包

    restful restful所需要的jar包 ========================================= Restlet, a RESTful Web framework for Java ========================================= http://www.restlet.org -------------------...

    Restful风格编程面试题

    Restful风格编程面试题 Restful风格编程简介 Restful风格编程是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更...

    RESTful Java Web Services

    ### RESTful Java Web Services #### 一、RESTful Web服务概览 REST(Representational State Transfer)是一种软件架构风格,最初由Roy Fielding在他的博士论文中提出。它定义了一种简单且灵活的方法来创建分布式...

    RESTful PHP Web Services

    #### 一、RESTful Web Services 背景介绍 REST (Representational State Transfer) 是一种软件架构风格,主要用于构建网络应用。RESTful Web Services 是基于 REST 架构风格的一种实现方式,它允许客户端通过 HTTP ...

Global site tag (gtag.js) - Google Analytics