Saturday, May 20, 2006
Ruby on Rails全景开发:(4)分类目录
Ruby on Rails全景开发:(4)分类目录
创建目录清单:
我们已经创建了Admin “控制器”,以便于卖方能够管理 “Depot” 应用程序。现在应该创建第二个“控制器”,它的目的是消费者。让我们称它为Store:
depot> ruby script/generate controller Store index
我们让它创建个新的“控制器”(叫StoreController),它包含一个Action:index();同时,我们需要数据库之外得到产品清单,并使它可以在显示这个表的“视图”中被编码。这意味着我们必须修改store_controoler.rb 内的index() 方法。我们需要在编写程序的时候找到一个合适的抽象级别方法,所以让我们假设我们可以要求一个“虚拟模型” 能提供我们可以出售的产品清单。
def index
@products = Product.salable_items
end
我们需要在“模型”内的product.rb 文件内定义方法salabel_items().
下面代码使用了Rails 的find() 方法,其中:
- :all 参数 —— 告诉Rais,我们想匹配给出条件的所有行;
- :conditions 参数 —— 要求留下所有date_available 域来小于等于now() 函数(MySQL的一个标准方法,获得当前的时间);结果是未来才有效的书目会被过滤掉,而只显示当前时间以前有效的书目;
- :order 参数 —— 把date_available 域按照降序排列起来;
find() 方法返回包含一个Product 对象的数组,此对象由从数据库返回的每一行组成。salable_items() 方法简单地处理这个处理并返回给“控制器”。现在我们需要写出“视图”模板。我们要在一个简单的表格中显示products 表。要做到这点,编辑app/views/store/index.rhtml 文件。记住“视图”的路径名由“控制器”(store)和“动作”(index)的名字构成。.rhtml部分表示它是个ERb模板。
形成一个框架式页面:
上次我们提到一个Layout 的概念,“层”是个模板,我们可以按顺序向其内添加内容。在我们的例子中,我们可以定义一个单独的“层”,用它来存储所有的页面并将目录页面也放到这个 “层”中。稍后我们可以对“购物车”和“付款页面”做同样的事情。我们能够在一个固定的框架里面,通过替换不同的内容,来实现在一个统一的界面中执行不同 的操作的功能。与传统的HTML里面的Frame相类似。除了使用了HTML构件外,这个“层”有三个Rails特定条目。
- 第四行使用了一个Rails “helper” 方法来生成一个标记给我们的depot.css 样式表。
- 第九行我们设置变量@page_title 的值为页标题。
- 但是真正的魔术是从第十九行开始的。Rails自动地设置变量@content_for_layout 给page-specific 内容
通过这个请求的“视图”调用来产生东西。在我们的例子中,这将是由index.rhtml 生成分类页面。同时,我们可以进一步修改index.rhtml 文件:
总结一下今天的工作:
- 创建个新的“控制器”来控制用户交互。
- 实现缺省的index()“动作”。
- 添加一个类方法给Product “模型”来返回可销售项目。
- 实现了一个“视图”(一个.rhtml文件)并添加“层”来包含它(另一个.rhtml文件)。
- 创建最简单的样式表。

