青软社区-青软培训软件学习社区

 

 

搜索
青软社区-青软培训软件学习社区 论坛 Ruby rails的原理和它的约定
查看: 3650|回复: 3
go

rails的原理和它的约定

Rank: 2

快速分享:收藏到QQ书签分享到白社会分享到豆瓣分享到网易微博添加到百度搜藏
发表于 2008-6-5 21:57 |显示全部帖子
我只是学习了不是很长时间,出错在所难免。如果出现错误,望大家原谅。
还有我建议大家在学习完j2ee和.net以后在学习ruby,因为现在还是这两种语言是主流。ruby还有待于进一步的考验和测试。基于jvm的动态语言已经产生,还有待突破,学习完j2ee可以去学习和关注.(java平台下的动态语言有groovy、nice、beanshell、jython、jruby、rhino(javascript)、jacl(tcl)、bistro(smalltalk)、kawa(lisp/schema))
今天说说rails的原理和它的约定,可以这样说,ruby离开rails框架,它也就成了垃圾。所以说先讲一下rails,还是必要的,以下是我整理的材料:

       
  • 无缝集成:rails 聪明地利用了 ruby 语言的最好特性。它扩展了 ruby,但您很难说出 ruby 在哪里结束,rails 从哪里开始。您也可以看到 active record(rails 的持久引擎)和模型-视图-控制器(mvc)框架之间进行了很好的集成。例如,您可以编写三行代码,创建一个表,然后立即为该模型生成用户界面。
       
         
       
  • 约定优于配置:为保持良好的灵活性,java 框架保持了大量普遍的配置文件。rails 不采用这种策略。它为方法、类、表和列采用普通的项目目录结构和简单普通的命名约定,以推断哪些已配置在 java 应用程序中。结果是,rails 应用程序只需要对应 java 应用程序的一小部分配置代码,一般是十分之一或更多。
       
  • 低重复:不要重复自己(don't repeat yourself,dry)是 rails 社区的一个常见术语。rails 框架委员会使用通常看起来像是 ruby 语言的扩展的方法来把重复的任务抽象出来。rails 的元编程策略使每行代码都执行更多的任务。
        即时反馈:使用 rails,对于您所做的大多数工作都会给出即时反馈。编写一行代码并保存后,在加载下一个 web 页面时将激活您所做的更改。更新了您的数据库以后,迁移可以向您即时显示更改。
        命名约定
        rails常常让新手感到迷惑的一件事,就是它会关心你给各种东西起的名字。新手们常常会吃惊:他们把模型类叫做person,而rails不知怎么的就知道应该去寻找名叫people的数据库表。
        以下介绍的规则都是rails的缺省约定。你可以在rails类中提供适当的声明,以取代这些约定。
        混合大小写,下划线,以及复数形式
        我们通常会用一个短语给变量和类命名。ruby的命名约定是:变量名应该全部小写,单词之间以下划线分隔;类和模块的名称中没有下划线,短语中每个单词的首字母(包括整个短语的第一个字母)大写。(我们将这种命名方式称为“混合大小写”,原因是显而易见的。)按照这种命名约定,变量名应该类似于“order_status”,类名则类似于“lineitem”。
       
    rails采用这种命名约定,并在两个方面对其加以扩展。首先,rails认为数据库表名应该像变量名一样,全部采用小写字母,单词之间以下划线分隔。而且,rails还会认为表名始终是复数形式的,也就是说表名应该类似于“orders”或者“third_parties”。另一方面,rails认为文件名也应该全部采用小写字母,单词之间以下划线分隔。
       
    rails会根据这些约定自动进行名称转换。譬如说,你的应用程序中可能有一个代表“订单项”的模型类,你把它叫做lineitem。根据这个名字,rails会推导出下列结论:
       
    ◎与之对应的数据库表应该叫line_items--先将类名转换成全小写,然后将其变成复数形式,最后在单词之间加上下划线。
       
    ◎rails还知道,应该到line_item.rb文件(位于app/models目录)去寻找这个类的定义。
       
    rails控制器还有额外的命名约定。如果应用程序中有一个store控制器,按照命名约定,rails会做出如下判断:
       
    ◎存在一个名为storecontroller的类,这个类位于app/controllers/store_controller.rb文件中。
       
    ◎存在一个名为storehelper的辅助模块,位于app/helpers/store_helper.rb文件中。
       
    ◎这个控制器的视图模板应该位于app/views/store目录下。
       
    ◎缺省的布局模板应该是位于app/views/layouts目录下的store.rhtml或者store.rxml文件。
       
    这里还有一点值得注意的:在编写普通的ruby代码时,如果你想要引用另一个文件中的类和模块,必须首先用require关键字将该文件包含进来。但在rails应用中,因为rails知道文件名与类名之间的关系,就不需要再使用require关键字。当你尝试引用一个暂且未知的类或者模块时,rails就会根据命名约定将类名转换成文件名,然后尝试加载该文件。于是,最终的效果就是:一般而言你都可以直接引用--譬如说--模型类,然后被引用的类就被自动加载到应用程序中了。
         
        正如你即将看到的,如果被引用的类要在session中保存,以上过程就会实效。在这种情况下,你必须显示声明这些类。但即便如此,你也不需要使用require关键字,只需要在控制其中加上类似这样的代码行即可:
        class storecontroller < applicationcontroller
        model :line_item
        <em>。。。</em>
        请注意,即便在这种情况下,命名约定仍然保持着一致:“:line_item”这个符号全部小写,并且单词之间用下划线分隔。这样,rails就会去加载line_item.rb文件,其中包含着lineitem类。
        按模块组织控制器
        到目前为止,我们所有的控制器都放在app/controllers目录下。有时候,如果能对控制器的放置加以组织,会让使用和维护更加便利。譬如说,在我们的在线商店应用中,最终可能会有几个控制器负责执行彼此相关又有所不同的管理功能。我们更愿意将它们组织在admin这个命名空间下,而不是让它们散落在顶级命名空间中。
       
        <table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
            <tbody>
                <tr>
                    <td style="border-right: gray 1.5pt solid; padding-right: 5.4pt; border-top: gray 1.5pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: gray 1.5pt solid; width: 328.85pt; padding-top: 0cm; border-bottom: gray 1.5pt solid; background-color: transparent" valign="top" width="438">
                     
                    david说&hellip;&hellip;
                    为什么用复数形式做表名?
                    因为听起来更符合人们的习惯。真的,“select product from products”,或者“order has_many : line_items”。
                    我们的目标是创建一种领域语言,让它成为编程语言与口头语言之间的桥梁。拥有这样一种语言,将可以避免很多讨论中的误会--交流障碍总是错误的源头。
                    如果遵循标准的命名约定,你可以省掉大部分的配置--这算是rails的一个礼物吧,奖给用正确方式做事的程序员。这不是要你放弃“自己的方式”,但采用符合约定的方式可以大大提高生产率--而且没有副作用。
                    </td>
                </tr>
            </tbody>
        </table>
       
        借助一个简单的约定,rails就实现了这一功能:如果进入的请求要访问名为admin/book的控制器,rails就会到app/controllers/admin目录去寻找book_controller控制器。也就是说,控制器名称的最后部分始终会被解析到<em>name</em>_controller.rb文件,此前的路径信息则被用于查找子目录,查找的起始点是app/controllers目录。
        假设我们的应用程序中有两组控制器(譬如说,admin/<em>xxx</em>和content/<em>xxx</em>),并且其中分别定义了一个book控制器--也就是说,在app/controllers目录的admin和content子目录下都有一个book_controller.rb文件。这两个控制器文件都定义了一个名叫bookcontroller的类。如果rails不采取什么措施的话,这两个类将会冲突。
        为了解决这个问题,rails会认为各个子目录中的控制器位于不同的ruby模块,模块的名称就是子目录的名称。这样一来,admin子目录下的book控制器就应该这样声明:
        class admin::bookcontroller < applicationcontroller
        # ...
        end
       

       
        content子目录下的book控制器则应该位于content模块中:
        class content::bookcontroller < applicationcontroller
        <em># </em>...
        end
        于是,这两个控制器就被分开保存了。不同控制器的模板也位于app/views中的不同子目录。也就是说,对应于下列请求
        http://my.app/admin/book/edit/1234
        的视图模板应该在以下文件:
        app/views/admin/book/edit.rhtml
        -----如果你测试了我前天发的ruby on rails配制时会吃惊,怎么只在命令行里输入了几行代码,就会把数据库中的表,字段,和它在程序中的视图层,控制层,数据层给建好了呢?原理吗?学习中,自己想想或搜搜了。
       
青软培训-软件培训专家

Rank: 1

发表于 2008-6-5 22:33 |显示全部帖子
好,不错!

Rank: 1

发表于 2008-6-6 13:37 |显示全部帖子
厉害!学习拉。。。。。

Rank: 2

发表于 2011-12-13 16:45 |显示全部帖子
走过路过不可错过                                       
                     www.seottk.com
你需要登录后才可以回帖 登录 | 注册

社区新帖
【视频下载】青软培训视频教程-Hibernate实
【视频名称】青软培训视频教程-Hibernate实战-操作入门 【视频大小】231M 【视频 ...
请教,各位老师一个问题,可能这个问题问的很
用jsp连接数据库没有问题,但是如果将连接数据库封装成一个类,然后再在jsp中用调用方法 ...
美轮美奂,节能环保,联想扬天一体机美图欣
美轮美奂,节能环保,联想扬天一体机美图欣赏 联想扬天为SMB和SOHO用户量身定做 ...
职场成功十大好习惯
一、不轻言退缩 二、不停学习,不断修正。 三、坐言起行,立即动手,从小事做起。 为 ...
现在的网络上的论坛真的是大行其道
青岛田园网论坛www.tioo.net,是青岛地区地区新兴的论坛之一,主要服务于青岛百姓的日 ...
你的未来不是梦—与青软学子共勉
很庆幸你选择了软件行业。这是一个前景无限的朝阳行业,一个充满机遇与挑战的行业,一 ...
高质量代码三要素[二]
3.可变更性 前面我提到了,软件的变更性是所有软件理论的核心,那么什么是软件的可变更 ...
日志
guxinzixuan腾讯发布2011年第一季度财报
腾讯第一季度总收入为人民币63.384亿元(9.668亿美元 ),比上一季度增长14.7%,比去年同
guxinzixuan我的互联网情节
     有人的地方就有江湖。在我看来,互联网更像一个江湖,唯一不
liuqitest
[attach]239[/attach][attach]240[/attach][attach]239[/attach]
MengGuangFulinux的那些事
怎么社区里面没有关于linux的帖子呢  我刚用虚拟机安装ubuntu系统 我想问下怎么能
MengGuangFu?
网站主页什么时候改的 昨天还没事
一个人的旅途学会感恩,收获人生
生活当中,自己所做的事情不一定都是别人认可的,也许这在当时会成为心中的纠结。但是
一个人的旅途Java查询结果生成Excel表格
Java中将查询的结果生成Excel表格,举例如下: 需要在WEB-INF/lib/中导入三个Jar包

青软培训-踏踏实实育人-勤勤恳恳奉献 ( 鲁ICP备09077726号 )

GMT+8, 2012-5-21 06:13 , Processed in 0.060654 second(s), 24 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc.