由于懒惰(喜欢DRY代码),我是那种会为重复出现的HTML标记编写一些小包装器的人。Rails提供的那些已经很好了,但有时我会有一些更具体的东西,我知道我会一遍又一遍地重复。
在某些情况下,分部可以是解决方案,但有时我只是过于频繁地调用片段,以证明使用分部的开销是合理的。
现在,我创建了一个helpers/html_helper.rb文件,并将它们粘贴在其中。问题是,在开发过程中,并没有根据请求动态地重新加载帮助程序。因此,每次我调整我的代码片段或代码时,我都必须杀死服务器并重新启动它
当然,这只是一个5秒的过程,但我喜欢Rails只需开发然后刷新浏览器的便利性。所以我也很想把它作为我的标记片段。
注意:仅仅在helper模块中粘贴"unloadable"是不起作用的。
好问题!这是一种我应该更经常使用的技巧。
#I go in environment.db (presumably it will work in one of the per-environment files, too.)
Dependencies.explicitly_unloadable_constants << 'NameOfHelperToReloadHere'
顺便说一句,至少在我安装的时候,这个数组一开始是空的。(通过控制台检查。)
我在本地测试了它,它对我有效,至少在Rails 2.0.2上是这样。这个解决方案的主要功劳属于这位先生。
如果将它们粘贴在application_helper.rb中,则每次都会加载它们,并可用于所有视图。这是每次在开发模式下加载的(或者至少我没有遇到任何问题)。
我通常会创建一些小助手,在整个站点中使用(例如,可排序的表头),这些助手使用相同的逻辑。
这应该在每个请求上重新加载所有帮助程序(假设您坚持默认的命名约定)
#Put this in config/environments/development.rb
ActiveSupport::Dependencies.explicitly_unloadable_constants.concat(Dir.glob("#{RAILS_ROOT}/app/helpers/**/*.rb").map {|file| File.basename(file, '.rb').camelize})
或者,如果您使用的是旧版本的Rails(我认为是2.0.2或更早版本)
#Put this in config/environments/development.rb
Dependencies.explicitly_unloadable_constants.concat(Dir.glob("#{RAILS_ROOT}/app/helpers/**/*.rb").map {|file| File.basename(file, '.rb').camelize})
适用于RoR 2.1.1
更新:将顶部代码段修改为包含"ActiveSupport::",这一定是从我的代码中错误地复制/粘贴的。
这不是一个真正的解决方案,但您可以使用测试(TestUnit、RSpec或其他)来确保您的助手按预期工作。这样,您就不会那么依赖助手的自动重新加载了。