Ruby On Rails开发技巧

Ruby On Rails开发时的技术还是很多很杂的,我现在把它们整理,列出来,方便自己,也方便大家。
注:我在其中所列的,也有不是ROR专有的,但是在Rails开发中实用。 

A:View 


1.Helper number_to_currency(@book.price)格式化显示时间,$89.00,合适开发英文网站。 

2.图片按钮提交表单,
Html代码   收藏代码
  1. <input type='image' src='/images/button2.gif' style='width:120px;height:30px;'/>  
把它放在
内,和submit button的作用一样,另说明一下,http://www.buttonator.com/这个网站上可以在线为我们生成自行设置的图片,很方便, 我又看了一下这个网站,感觉它也很优秀, http://www.mycoolbutton.com  

3.奇偶行变色:
Html代码   收藏代码
  1. <%=cycle('list-line-odd', 'list-line-even') %>  

4.鼠标放上去变色,这个虽然是HTML方面的代码,但是在WEB开发中也用得比较多,所以记一下。
Html代码   收藏代码
  1. onmouseover="this.style.background='#FFFCDF';" onmouseout="this.style.background='#FFF';"  

5.改进Flash消息的显示。Flash消息显示4秒后,淡出。
Html代码   收藏代码
  1. <% if flash[:warning] or flash[:notice] %>  
  2.   <div id="flash_message" <% if flash[:warning] %>class="warning"<% elsif flash[:notice] %>class='notice'<% end %> >  
  3.     <%= flash[:warning] || flash[:notice] %>  
  4.   div>  
  5.   <script type="text/javascript">  
  6.     setTimeout("new Effect.Fade('flash_message');", 4000)  
  7.   script>  
  8. <% end %>  

别忘记了<%= javascript_include_tag :defaults %>,另外,对于Flash消息显示的css代码如下,
Html代码   收藏代码
  1. .notice{  
  2.     margin-top:5px;  
  3.     padding: 8px;  
  4.     border-top:2px solid #73E673;  
  5.     border-bottom:2px solid #73E673;  
  6.     background:#B6F2B6;  
  7. }  
  8. .warning{  
  9.     margin-top:5px;  
  10.     padding: 8px;  
  11.     border-top:2px solid #FFF280;  
  12.     border-bottom:2px solid #FFF280;  
  13.     background:#FFF9BF;  
  14. }  

6.为了避免过长字符串撑开页面,经常需要调用截取过长字符串的方法,rails已经为我们提供了一个方法:
Ruby代码   收藏代码
  1. ActionView::Helpers::TextHelper#truncate(text, length = 30, truncate_string = "...")   

中英文混合字符串截取,见:http://www.iteye.com/topic/201531 
Ruby代码   收藏代码
  1. #Quake Wang的做法  
  2.     def truncate_u(text, length = 30, truncate_string = "...")  
  3.         if r = Regexp.new("(?:(?:[^\xe0-\xef\x80-\xbf]{1,2})|(?:[\xe0-\xef][\x80-\xbf][\x80-\xbf])){#{length}}"true'n').match(text)  
  4.             r[0].length < text.length ? r[0] + truncate_string : r[0]  
  5.         else  
  6.             text  
  7.         end  
  8.     end  
  9.       
  10.       
  11.     #庄表伟的做法  
  12.     def truncate_u2(text, length = 30, truncate_string = "...")  
  13.     l=0  
  14.     char_array=text.unpack("U*")  
  15.     char_array.each_with_index do |c,i|  
  16.     l = l+ (c<127 ? 0.5 : 1)  
  17.         if l>=length  
  18.         return char_array[0..i].pack("U*")+(i"")  
  19.         end  
  20.     end  
  21.     return text  
  22.     end  

7.图形验证码的使用,首先要装上rmagick,将附件里的rb文件放在/app/models里,图片的引用src='xxx/code_image',则在xxx控制器的code_image方法定义如下
Ruby代码   收藏代码
  1. def code_image  
  2.     session[:noisy_image]=NoisyImage.new(4)  
  3.     session[:code] =session[:noisy_image].code  
  4.     image = session[:noisy_image].code_image  
  5.     send_data image, :type => 'image/jpeg':disposition => 'inline'  
  6.  end  

相信你看了以上的代码,也就知道怎么样验证用户输入的验证码是否一致了吧。 

8.JavaEye的时间格式显示 
# 将此方法放在/app/helpers/中   
Ruby代码   收藏代码
  1. def status_time_ago_in_words(time)  
  2.  time = time_ago_in_words(time)  
  3.  case time  
  4.  when "less than a minute"  
  5.    "刚刚"  
  6.  when /minute/  
  7.     time.gsub(/minute|minutes/,'分钟') + "前"  
  8.  when /hour/  
  9.     ##time.gsub(/about/,'').gsub(/hours/,'小时') + "前"  
  10.     time.gsub(/about (\d+) (hour|hours)/, '\1小时') + "前后"  
  11.  when "1 day"  
  12.     "昨天"  
  13.  when "2 days"  
  14.     "前天"  
  15.  else  
  16.    time.gsub(/days/,'天') + "前"  
  17.  end  
  18. nd  

9.格式化数字以千分位形式显示 
ails的ViewHelper中有 number_with_delimiter (number, delimiter=",", separator=".")方法,它的源代码位于# File vendor/rails/actionpack/lib/action_view/helpers/number_helper.rb, line 125  
eg:number_with_delimiter(”162558855.3333233“)#162,558,855.3333233 

10. 
    *  number_to_currency 
    * number_to_human_size 
    * number_to_percentage 
    * number_to_phone 
    * number_with_delimiter 
    * number_with_precision
 
看看吧,在NumberHelper中!是关于数方方面的Helper. 

11.在线制作LOGO,有倒影效果和Beat, http://h-master.net/web2.0/index.php#home  

12.将错误信息显示在自己想要的地方: 
Ruby代码   收藏代码
  1. #写在helper里  
  2. def errors_for(object, attribute)  
  3.     if errors = object.errors.on(attribute)  
  4.         errors = [errors] unless errors.is_a?(Array)  
  5.         return "" + errors.map {|e| "
  6. " + e + "
  7. "}.join + ""  
  8.     end  
  9.  end  

在页面上使用 
Html代码   收藏代码
  1. <%= errors_for @model, :description %>  


13. 
ActionController::InvalidAuthenticityToken解决办法 
在表单中 
Html代码   收藏代码
  1. <%= tag(:input, :type => "hidden", :name =>   
  2. request_forgery_protection_token.to_s, :value =>   
  3. form_authenticity_token) %>   


14.Rails中加密字符串 
MD5加密: 
Ruby代码   收藏代码
  1. require 'digest/md5'  
  2.   
  3. puts Digest::MD5.hexdigest("Hello World!")  

SHA1加密: 
Ruby代码   收藏代码
  1. require 'digest/sha1'  
  2.   
  3. puts Digest::SHA1.hexdigest("Hello World!")  


15. 其他

     * 将你的程序所用到的密码和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 来从日志中过滤重要。负责你的程序日志中将充满用户的密码。 


  
转自 http://wiki.rubyonrailscn.org/rails/show/Rails开发技巧集锦 


你可能感兴趣的:(RUBY编程,WEB开发测试,Ruby,Rails)