- 阅读权限
- 20
- 注册时间
- 2008-7-26
- 最后登录
- 2008-7-26
- 积分
- 80
- 精华
- 0
- 帖子
- 160
- 主题
- 42
- UID
- 37

|
我只是学习了不是很长时间,出错在所难免。如果出现错误,望大家原谅。
还有我建议大家在学习完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说……
为什么用复数形式做表名?
因为听起来更符合人们的习惯。真的,“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配制时会吃惊,怎么只在命令行里输入了几行代码,就会把数据库中的表,字段,和它在程序中的视图层,控制层,数据层给建好了呢?原理吗?学习中,自己想想或搜搜了。
|
|