icon 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.rbbar_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)