命名约定
命名在rails有着非常重要的意义。它通过命名机制减少了很多外在的配置,使得整个代码更加紧凑简洁。同时也给初学者带来了一些困惑。下面是一些rails默认的约定。
我们经常使用短语来命名变量和类。在ruby里通常约定变量的名字全是小字母,单词之间用下划线隔开。类和模块命名则不同,它们没有下划线,短语中每个单词的第一个字母以大写开头。(称为mixed-case,混合型)比如变量order_status,类LineItem。
Rails中采用了这种约定并以两种方式进行了扩展。第一,它假定数据库的表名和变量名一样,都是小写字母,单词之间是下划线。rails还假定表名通常是复数形式。比如表名orders,third_parties。另一方面rails假定文件都是以小写字母带下划线来命名。
rails为自动转换名字会使用这些命名约定的规则。例如,你的程序可能包含一个model类来处理细目(line items),你已经使用ruby的命名约定来定义这个类LineItem。为此,Rails将自动做出以下的规则:
1)对应的数据库表名被称为line_items。注意是小写字母,下划线,复数。
2)rails也将知道在一个叫line_item.rb(在app/models目录中)的文件中去寻找类LineItem的定义。
rails的控制器也有附加的命名约定。如果应用程序由一个store控制器,那么会发生以下一些情形:
1)rails假定类被称为StoreController,并且它是定义在app/controllers目录下store_controller.rb的文件中
2)假定有一个StoreHelper的helper模块,它是位于app/helpers目录下的store_helper.rb中。
3)负责输出的views和layout template包含在目录app/views/layouts/下的store.rhtml或者store.rxml中。
Model命名:
table line_items
class LineItem
file app/models/line_item.rb
Controller命名:
url http://.../store/list
class StoreController
file app/controllers/store_controller.rb
method list()
layout app/views/layout/store.rhtml
view命名:
url http://.../store/list
file app/views/store/list.rhtml(or .rxml)
helper module StoreHelper
file app/helpers/store_helper.rb
这里还有一个需要提醒的。在正常的ruby代码中引用以上那些文件中的class和module必须使用require来包括ruby的源文件。因为rails知道这些文件名,类名之间的关系。所以require在rails里是没有必要的。这样的好处是不言而喻的,你可以直接引用model类名,这个model将自动加载到程序中。
正如你所看到的,这种模式在你的类被存储到sessions中时会行不通。因此你必须要明确地声明。即使这样,你也不必使用require。相反,你的控制器只要包含一行,像这样:
class StoreController < ApplicationController
model :line_item
#...
注意这里的命名约定还是和前面是一致的。它将会把line_item.rb加载进来,这个文件包含类LineItem。
把Controllers归组到模块
到目前为止,我们所有的controllers都是在app/controllers目录中。有时加入更多的结构会更方便。例如:我们的store可能会用到很多的controller,它是要执行相关的管理上的功能。为了不影响到上层的名字空间,我们可能会把他们归组到一个单一的admin名字空间。
rails将会使用一个简单的约定来做这件事。如果一个进来的request有一个名字为admin/book的控制器,rails将到目录app/controllers/admin中找名为book_controller。也就是说,这个controller的名字的最后部分将被解析到一个名为name_controller.rb的文件,app/controller/之后的路径信息通常被作为子目录。
