Ruby on Rails 2.0 日记
第9章 helper :all
虽然不是很引人注目的变化,从 Rails 2.0 开始控制台定义中可以写 helper :all 。
到 Rails 1.2 ,如果在 app/helpers 目录下有 foo_helper.rb, bar_helper.rb, baz_helper.rb 这 3 个帮助模块的话,便有下面这样写的必要。
class ApplicationController < ActionController::Base helper :foo, :bar, :baz ... end
从 Rails 2.0 开始,可以写得这样简洁:
class ApplicationController < ActionController::Base helper :all ... end
但是,对于 ApplicationController 上声明 helper :all 这一点,也有不好的地方。这个实际上声明了在所有的控制台上共有所有的帮助文件。这意味着去掉了Rails 1.x 时代的一项技术。
Rails 1.x 中(没有声明 helper :all 的话也包括 Rails 2.0),利用控制台名称里添加了 '_helper.rb' 名称的帮助模块自动被加载的性质,可以稍微得到些技巧。换言之就是在 foo_helper.rb 与 bar_helper.rb 中定义同名的方法(例如,page_title), 通过 foo 控制台以及 bar 控制台利用同一方法的同时切换显示的技巧。
声明 helper :all 的话,便包含了全部的帮助模块,所以对每个控制台引用的帮助模块不能进行操作。不管是 foo 控制台还是 bar 控制台, page_title 帮助进行的活动是完全一样的。但是麻烦的是不能预测用的是 foo_helper.rb 的定义还是 bar_helper.rb 的定义。只是在内部通过
Dir["#{HELPERS_DIR}/**/*_helper.rb"]
代码生成帮助模块文件的清单,按顺序读取并引用。
在Rails 2.0 中导入 helper :all ,而且在生成程序时产生的 ApplicationController 上写入 helper :all 声明,这个事情也许意味着 Rails 的设计者们开始舍弃初期的在每个控制台设置帮助模块的思想。
因为 controller 发生器如同以前一样一起生成帮助模块,所以未必就是我想的那样。但是我却不知道拿在这之前每个控制台生成的帮助模块怎么办,实际操作中就让它空着。我在学习 Rails 的时候就中意的“每个控制台的帮助模块”的想法,现实中却没派上多大用场。大概世界上有很多 Rails 开发者和我的感受一样吧。
另外,关于帮助, Rails 2.0 中还有一个小小的变化。以前在不存在与控制台名称相对应的帮助模块的情况时,在运行记录上记录警告。虽然也没什么坏处,但总让人感觉不舒服。以后这个警告就不被记录了。引入 helper :all 的话,这个改变便是理所当然的,是件值得欢迎的事情。
--
黒田努
(2008/05/05)
- 前言
- 第1章 安装 (2007/12/15)
- 第2章 生成新程序 (2007/12/16)
- 第3章 SQLite3 (2007/12/21)
- 第4章 模板文件的扩展名 (2007/12/22)
- 第5章 功能测试 (2008/01/19)
- 第6章 redirect_to 与 url_for (2008/02/24)
- 第7章 config/initializers 目录 (2008/02/27)
- 第8章 生成 Rails 1.2 的 API 文档 (2008/03/04)
- 第9章 helper :all (2008/05/05)

