<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title></title>
    <description></description>
    <link>http://rubyonrailscn-org.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title> Rails开发技巧集锦</title>
        <author>rubyonrailscn.org</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rubyonrailscn-org.javaeye.com">rubyonrailscn.org</a>&nbsp;
          链接：<a href="http://rubyonrailscn-org.javaeye.com/blog/191976" style="color:red;">http://rubyonrailscn-org.javaeye.com/blog/191976</a>&nbsp;
          发表时间: 2008年05月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天在网上看到一个Rails开发技巧一览，看了觉得很有用，所以翻译了，贴在 Ruby on Rails 中文 Wiki <a href="http://wiki.rubyonrailscn.org" target="_blank">http://wiki.rubyonrailscn.org</a>上。转发在这里，希望对大家有帮助。<br /><br />本列表整理自Massive List of Rails Development Tips<br /><br />    * 将你的程序所用到的密码和API证书号保存在一个自定义的配置文件中。我使用一个YAML并沿用了database.yml类似的格式。<br />    * 有需要的时候就使用常量。不要重复诸如你的客服邮件地址这类字符串，而是将它们保存在常量中（可以保存在environment.rb或者你自己的配置文件中），然后在整个程序中使用该常量。<br />    * 保持使用UTC时间，这可以使你的程序有更好的一贯性。（不过Rails 2.1的Timezone可提供更好的功能）<br />    * 请勿在一个 Active Record? 数据模型中遍历另一个数据模型。那样的话会产生大量的SQL查询操作。正确的实现方法是：1）如果多个数据模型已经相互关联，那么可以使用find(: include) 方法进行勤式数据获取，那样的话在一个SQL查询中就可以获取多个数据模型中的数据。2）如果这些数据模型没有被关联，那么你可以写一个自定义的 find，在其中采用select和join来定义跨表查询。这样的话你可能需要你的数据库模型中为非本表的域定于值读取方法以获得正确类型的值。<br />    * 请小心使用二进制域。在默认情况下，数据库查询会返回所有的域，包括任何二进制域中的完整内容。请使用 :select 来定义所需要获取的域，从而减轻系统负荷。<br />    * 要生成周期性报表时，请为报表数据创建一个专用数据表，然后将报告数据缓存到该表中。这样做要比每次现实年度或月度报告是重新产生数据要来的快得多。<br />    * 创建一个国家列表数据库。默认情况下，Rails使用字符串来选择和罗列国家，这对于数据模式的一致性来说是有害的。而且在生成报告时会产生问题。<br />    * 避免编写臃肿的控制器(controller)，不要将一堆方法塞入controller，如果一个controller中有超过10个方法，那么请重新考虑你的设计<br />    * 保持你的控制器和视图（view）尽量精简，在绝大多数情况下，你的大部分代码应该位于数据模型中，而不是控制器或者视图中。<br />    * 不要在session中保存对象。如果需要的话，在session中保存数字或者字符串，然后在处理单个请求的时候根据session中的内容从数据库取回数据。（Rails 2.0 中的新session机制解决了这个问题）<br />    * 避免处理信息量超大的请求回复(response)。遇到要处理大信息量的请求时，你可以将改记录标志为有待处理，然后使用一个cron事务或者消息服务来处理这个花费时间的任务。Background RB? 也是一个选择. (我使用这种基数来过滤blog中的SPAM).<br />    * 当需要批量发送邮件时，请使用 ar_mailer，而不要在一个Rails的请求回复过程中进行发送。<br />    * 使用 exception_notification插件， munin, monit等工具来监管你的应用程序和服务器。<br />    * 不要吝啬硬件投入，那样的话你因为劣质的备份或便宜的硬件，而很快不得不花钱请人解决那些问题。<br />    * 测试驱动（Test-drive）你的开发<br />    * 使用数据库索引来提供查询速度。Rails仅索引主键，所以你需要根据具体情况设定额外的索引。<br />    * 测量你的代码性能。使用ruby-prof gem 和插件测量你的代码，可以做些小修改便可使你的应用程序成倍提速。<br />    * 将图像相关的代码依赖度减少到最小。如果你的应用程序仅仅需要生成一些缩略图，那么不要将内存浪费在导入巨大的图像库上，相反可以使用mini-magick 或 image_science 等轻量级图像库。<br />    * 避免无节制地渲染小的片段（partials）<br />    * 使用CSS而避免使用行内标签来定义风格<br />    * 不要使用 Active Record? 的 serialize 选项在数据库中保存巨大的对象<br />    * 在数据模型中使用 attr_protected :fieldname 以避免关键数据被通过修改过的表单而改写。（attr_accessible 是更安全的方式，这里解释了为什么<br />    * 使用Ruby类和继承来重构重复的控制器代码<br />    * 使用 Javascrip 技巧将页面行为从页面代码标签中分离出来<br />    * 将能够自给自足的类和模组（module）封装成 plugin 或 Ruby Gems?.<br />    * 尽可能缓存经常被访问的数据库。<br />    * 编写自定义的 Test::Unit assertions 或 rSpec matchers 来帮助调试测试中出现的错误<br />    * 使用 Linux 上的logrotate daemon 来 Rotate the Rails 和 Mongrel 的日志文件<br />    * 需要可靠的备份需要<br />    * 使用 Capistrano 或 Vlad 来自动部署你的网络应用程序<br />    * 尽量保持方法精简。当一个方法长过10行时，请考虑重构它<br />    * 运行 flog 来找出过于复杂的方法和类<br />    * 不必过多使用条件语句。避免使用多层嵌套的if语句，而使用Ruby的case语句和Ruby对象来进行条件处理。<br />    * Ruby 提供强力的元编程功能，不过这个功能很容易被滥用 (比如 eval 和 method_missing).<br />    * 熟悉了解各种流行的插件。 Instead of re-implementing the wheel, save yourself some time by using well tested, popular plugins.<br />    * 在你的login 或 user 控制器中使用 filter_parameter_logging :password, :password_confirmation 来从日志中过滤重要新。负责你的程序日志中将充满用户的密码
          <br/>
          <span style="color:red;">
            <a href="http://rubyonrailscn-org.javaeye.com/blog/191976#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 11 May 2008 19:30:41 +0800</pubDate>
        <link>http://rubyonrailscn-org.javaeye.com/blog/191976</link>
        <guid>http://rubyonrailscn-org.javaeye.com/blog/191976</guid>
      </item>
  </channel>
</rss>