这里整理了一些在Rails开发中常用的技巧,帮助增加程序的灵活性和安全性,使你的程序更以被修改和调试,并减少程序的维护成本。
本列表整理自Massive List of Rails Development Tips
- 将你的程序所用到的密码和API证书号保存在一个自定义的配置文件中。我使用一个YAML并沿用了database.yml类似的格式。
- 有需要的时候就使用常量。不要重复诸如客服邮件地址这类字符串,而是将它们保存在常量中(可以保存在environment.rb或者自定义的配置文件中),然后在整个程序中使用该常量。
- 尽量使用UTC时间,这可以使应用程序看起来更加一致性。(不过Rails 2.1的Timezone可提供更好的功能)
- 请勿在一个 ActiveRecord 数据模型中遍历其它的数据模型。那样的话会产生大量的SQL查询操作。正确的实现方法是:1)如果多个数据模型已经相互关联,那么可以使用find(:include) 方法使用预先加载技术,那样的话在一个SQL查询中就可以获取多个数据模型中的数据。2)如果这些数据模型没有被关联,那么你可以写一个自定义的find,在其中采用select和join来定义跨表查询。这样的话你可能需要你的数据库模型中为非本表的域定于值读取方法以获得正确类型的值。
- 使用二进制字段时请小心。默认情况下,查询数据库会返回所有的字段,包括任何二进制字段中的完整内容。最好是使用 :select 来定义所需要获取的字段,从而减轻系统负荷。
- 要生成周期性报表时,请为报表数据创建一个专用数据表,然后将报告数据缓存到该表中。这样做要比每次现实年度或月度报告是重新产生数据要来的快得多。
- 创建一个国家列表数据库。默认情况下,Rails使用字符串来选择和罗列国家,这对于数据模式的一致性来说是有害的。而且在生成报告时会产生问题。
- 避免编写臃肿的控制器(controller),不要将一堆方法塞入controller,如果一个controller的方法超过10个,那设计上或许有问题了。
- 保持你的控制器和视图(view)尽量简洁,在绝大多数情况下,大部分代码应该放在于数据模型中,而不是控制器或者视图中。
- 不要在session中保存对象。在必要时可以让session中保存数字或者字符串,然后在处理单个请求的时候根据session中的内容从数据库取回数据。(Rails 2.0 中新的session机制解决了这个问题)
- 避免处理信息量超大的请求回复(response)。遇到要处理大信息量的请求时,你可以将改记录标志为有待处理,然后使用一个cron事务或者消息服务来处理这个花费时间的任务。BackgroundRB 也是一个选择. (我使用这种基数来过滤blog中的SPAM)。
- 当需要批量发送邮件时,请使用 ar_mailer,而不是在一个Rails的请求回复过程中进行发送。
- 使用 exception_notification插件, munin, monit等工具来监管你的应用程序和服务器。
- 不要吝啬硬件的投入。使用劣质的备份或廉价的硬件会让你常常在服务器的维护上花费上一大笔钱,这得不偿失吧。
- 测试驱动(Test-drive)开发
- 使用数据库索引来提供查询速度。Rails只索引主键,所以需要根据具体情况设定额外的索引。
- 对代码进行性能测试。使用ruby-prof 和插件测试,找到性能瓶颈后做些小修改就能让应用程序成倍提速。
- 将图像相关的代码依赖度减少到最小。如果应用程序仅仅需要生成一些缩略图,那么不要将内存浪费在导入巨大的图像库上,相反可以使用mini-magick 或 image_science 等轻量级图像库。
- 避免无节制地渲染小的片段(partials)。
- 使用CSS而不是在标签内定义样式。
- 不要使用 ActiveRecord 的 serialize 选项在数据库中存储过大的对象。
- 在数据模型中使用 attr_protected :fieldname 以避免关键数据被通过修改过的表单改写。(attr_accessible 是更安全的方式,这里解释了为什么
- 使用Ruby类和继承来重构重复的控制器代码
- 使用 Javascrip 技巧将页面行为从页面代码标签中分离出来。
- 将能够自给自足的类和模块(module)封装成插件 或 RubyGems。
- 尽可能缓存经常被访问的数据库。
- 编写自定义的 Test::Unit 断言或 RSpec 匹配器有助于调试测试中出现的错误。
- 使用 Linux 上的logrotate 守护进程来轮询 Rails 和 Mongrel 的日志。
- 创建一个可靠的备份系统。
- 使用 Capistrano 或 Vlad 实行自动部署。
- 尽量保持方法精简。请重构超过了10行代码的方法。
- 运行 flog 来找出过于复杂的方法和类。
- 避免过多使用条件语句。使用Ruby的case语句和Ruby对象来进行条件处理,代替那些丑陋的多层嵌套if语句。
- 不要自作聪明。Ruby 提供无比强大的元编程功能,不过这个功能很容易被滥用 (比如 eval 和 method_missing).
- 熟悉了解各种流行的插件。 不要重新发明轮子,使用经过测试的流行插件既省时又省力。
- 在login 或 user 控制器中使用 filter_parameter_logging :password, :password_confirmation 来从日志中过滤重要。负责你的程序日志中将充满用户的密码。