Author Archives: yuanyi

升级到Rails 3 Beta

安装 gem install tzinfo builder memcache-client rack rack-test rack-mount erubis mail text-format thor bundler i18n gem install rails –pre 这里会遇到一个rack-mount依赖问题,可以通过手动安装0.4.0版的rack-mount解决: sudo gem install rack-mount -v=0.4.0 升级应用 rails_upgrade(http://github.com/rails/rails_upgrade)是Rails官方的Rails3升级辅助插件,它提供了几个Rake任务帮助你轻松完成升级。 1. 执行 rails:upgrade:backup 备份会被Rails 3覆盖的文件,比如:application_controller.rb会被重命名为application_controller.rb.rails2 2. 执行 rake rails:upgrade:routes 生成Rails 3格式的routes.rb,以及rake rails:upgrade:gems生成新的Gemfile 3. 在你的程序目录执行: rails . 注意不要覆盖routes.rb和Gemfile 接下来要做的就是将备份的rails2文件合并到新生成的文件中,再次启动应用,如果幸运的话,你的应用现在已经运行在Rails 3 beta上了,注意检查Log中的Deprecated Warning,并将其替换为Rails 3的方式,关于Rails 3的新特性请参看Release Notes:http://guides.rails.info/3_0_release_notes.html ActionView Rails 3重写了View Helper,并作废了以前的link_to_function, [...]

Posted in 指南 | Tagged | 2 Comments

Rails保存记录而不更新时间戳

Rails的save和update方法默认都会将updated_at更新为当前时间,并且不允许手动设置,但是有些情况下,我们可能希望只更新记录的某个字段,而不希望updated_at被更新,比如显示帖子的时候增加帖子的查看次数,这可以通过设置model的record_timestamps属性实现: Post.record_timestamps=false 但是因为record_timestamps是一个类变量,因此改变这个值会影响到所有Post的保存,如果在同一时间有用户确实修改了Post的内容或者标题,updated_at也将不会更新。 Neeraj在这篇帖子里提供了一个方法,只修改当前对象的record_timestamps属性,在保存完后再进行恢复: module ActiveRecord   class Base     def save_without_timestamping       class

Posted in 其它 | 1 Comment

IE7 Bug导致Rails Session保存失败

同一套代码,部署在同一台服务器上,但是很诡异的是一套工作,另外一套登录的时候总是出现 ActionController::InvalidAuthenticityToken 的异常,即使加上skip_before_filter :verify_authenticity_token,虽然没有异常了,但是仍然无法登陆,追踪进去发现是Rails的Session保存失败,Google了一下“IE rails session can’t be save”,找到这篇帖子,似乎只是IE7独有的一个Bug,当你的子域名包含下划线时,IE7会拒绝接受Session Cookie,从而导致Rails的Session保存失败,而我的两个应用唯一的区别恰恰就在一个应用的域名包含有下划线。 这个问题困扰了我一下午,希望这个帖子可以给遇到同样问题的人节省一点时间。

Posted in 其它 | 3 Comments

财付通Rails插件

最近需要给(ZT)增加在线支付功能,比较了国内的各种支付方案,最后选择了财付通,申请比较简单而且没有年费,但是腾讯官方只提供了PHP,JSP和ASP的代码,只能自己写了一个Rails的。 安装 $ script/plugin install git://github.com/yzhang/tenpay.git 使用 1. 插件安装后,会在你的config目录下创建一个tenpay.yml文件(默认是腾讯提供的测试帐户,往这个帐户付款它居然真的就收了,虽然只是1分钱),你需要修改这个文件,填入你从腾讯申请的商户号(spid)和密钥(key)。 2. 下面的代码演示如何创建一个新交易: @request = Tenpay::Request.new(‘测试产品’, # 产品名称       1, # 订单编号,需要保证全局唯一       4500, # 产品价格,以分为单位       ’http://return’, # 用户完成支付后返回的URL, 支持Get/Post       request.remote_ip, #用户IP,用户production模式下检验用户,development模式忽略。       ’attach data’) # 商户数据,会原样传递给返回URL,可不填 redirect_to @request.url 用户访问这个action的时候会被引导到支付页面。 3. 用户完成支付后,需要返回商户页面,也就是你在请求中填写的返回URL,下面的代码用于验证请求是否有效: @response = Tenpay::Response.new(params) if @response.successful?   # 支付成功 else   # 不合法的请求或支付失败 end 目前还不支持查询接口,欢迎大家的意见和建议。

Posted in 插件 | 3 Comments

程序员的8个级别,你想成为哪一种?

相信很多人都曾经被面试官问过这样的问题:”你对自己未来5年的职业规划是怎样的?“,每当我被问起这个问题时,我的脑海中总是会浮现出《Twisted Sister》(一部拍摄与1984年的电影)中的这个场景,一名老师对着他的学生大喊。 我想要你告诉我,不,是告诉全班的学生   你究竟想要怎样的生活? 一般情况下,你的很自然的想法就是:你要变得很牛,或者至少变成一个很牛的程序员。尽管这个问题看起来并不像其它一些同样老掉牙的问题(比如,”你觉得你最大的弱点是什么?“)那么严肃,但很可能你还是会觉得难于回答,回避这个问题明显不是一个明智的选择。 但是,在我看来,这个问题同样是一个相当严肃的问题,只不过大部分人都没有注意到他的重要性,不是对面试官,而是对你自己。 对于这个问题,大部分人都会选择一个不痛不痒的答案来敷衍面试官,但如果你深入的思考这个问题,你会发现这实际上是一个关于软件开发人员可能的职业 生涯轨迹的问题,当然,我们选择这一行是因为我们喜欢这行,并且幸运的得到老天的眷顾,我们干上了这行,但你能在50岁的时候依然坐在电脑前面敲代码 嘛?60岁呢?所以,我们必须在还年轻的时候先思考一下这个问题:作为一个程序员,最完美的职业生涯应该是什么样? 如果你懒得自己思考,那就让我来告诉你吧,基本上,这个世界的程序员可以分为8种类型: 1. 不朽的程序员 这是最高的级别,虽然你的人已经挂了,但是你的代码却依然活着,你成为计算机博物馆中的一个永久收藏,为数众多的程序员持续的学习和阅读你的作品。 你在生前已经赢得了许多的赞誉,发表了大量非常重要的论文或者是创造了许多影响到计算机专业课程设置的基础技术。你已经不仅仅只是拥有一个维基百科的条 目,会有许多专门的网站讲述你的作品以及你生平的事迹。 能够达到这一级别的程序员屈指可数,这一级别的代表人物是:Dijkstra, Knuth, Kay 2. 成功的程序员 成功的程序员不仅拥有广泛的知名度,并且还运营着一个不错的公司——甚至是整个产业链。他们拥有绝对的自由可以做他们想做的事情。 这一级别的程序员是最多人羡慕的,到达这一级别更多的是需要商业上的才能而不是你的编程能力。 代表人物:Gates, Carmack, DHH 3. 知名程序员 成为这个级别的程序员也不错,当然前提是,你得有一份不错的工作。 这个级别的程序员虽然在圈子里很有名,但是成为名人并不意味着你可以靠这个获取收入甚至是养活你自己。知名固然不错,但无疑成为成功的程序员更加的 好。你的公司可能是一家非常知名的大技术公司,也可能是一家很有影响力的小公司或者是一个最新潮的创业团队,其它的程序员都应该或多或少的听说过你,并且 你对你所从事的领域可以起到积极的影响。 4. 工作杰出的程序员 你做为一个软件工程师的职业生涯非常的成功,因为你的工作能力相当杰出,你从来不会为找不到一份你满意的好工作好发愁,你的同事也非常尊敬你,每一家你工作过的公司都因为你的加盟而在某些方面得到了增强。 但问题是:你接下来的方向在哪呢? 5. 能力一般的程序员 这个级别的程序员,一般来说,由于天赋的差异,通常很难成为杰出的程序员,但天赋跟成功的关系其实不是很大,如果你有很好的商业或者是与人沟通的技 能,你依然可以直接跳升到成功的程序员级别。如果你是一个能力一般的程序员,但你却靠这行当过上了不错的生活,那说明你必须在其它方面有很好的天赋(除了 编码)。 不要怀疑自知的价值,通常你的能力都会比你认为的要少,但缺乏天赋并不是什么大不了的事情。要勇敢一点,发掘自己的特长,并充分利用,你也会成功的! 6. 业余的程序员 业余程序员通常都很喜欢编码,一般来说以学生和实习生为主,他们通常会向开源项目共享代码,或者利用空闲时间凭自己的兴趣开发一些应用,他们的代码和创意通常看起来都很有激情。 成为一个业余程序员是个好事情:这个级别的程序员可以很快速的成为一名工作杰出的程序员。 7. 未知的程序员 还有一些很知名的程序员,比如Joe Coder,有能力但是不太引人注目,很可能在为某个大公司工作。对于这类人来说,写代码仅仅只是工作,并非他们生活的全部,这没什么错,挺好的。 8. 差劲的程序员 这个级别的程序员通常是因为某些意外阴差阳错的成为了程序员,但他们本身并不具备写代码的技能,所有他们做的东西都成了他们同事的噩梦——当然有一种例外,就是他的同事也是十分差劲的程序员,差到都不具备与他的同事进行基本的沟通。 基本上,如果要给差的程序员下一个定义,那就是:没有金刚钻,却揽了瓷器活。 当然,这个级别排的不是很严肃,并且每个人对自己的职业规划都不一样。它只是想给你一点启示,那就是你在未来的10年,20年,30年甚至是你整个一生究竟能够完成哪些事情,你最为崇拜那个程序员,他身上的哪些特点最为吸引你? [...]

Posted in 其它 | 7 Comments

city_helper: 省市二级联动Select插件

此插件已更新,请移步这里: http://www.letrails.cn/archives/city-helper-update-i18n-and-country-support/ city_helper提供了几个简单的helper来实现省及城市的二级联动select,目前只支持国内城市,经过测试的浏览器:FF3, Chrome 2 beta, IE7, Safari 4。 安装 $ script/plugin install git://github.com/yzhang/city_helper.git 使用 安装之后,你就可以在View中直接使用以下Helper了: state_select :user, :state # 选择省份 capital_select :user, :city # 选择省会城市 city_select :user, :city # 选择所有地级及地级以上城市 state_and_city_select :user, :state, :city # 省市二级联动select 当然,你也可以在FormBuilder中使用,同时还有一个不需要object的_tag版本: form.city_select :city city_select_tag :city 你也可以传递options给city_helper,参数定义同select: city_select :user, :city, options, html_options state_and_city_select :user, :state, :city, {:city => city_options, [...]

Posted in 插件 | 4 Comments

使用rails_reviewer优化Rails数据库查询性能

最近在做的一个项目遇到严重的性能问题,主要是数据库查询过多,同事向我推荐了rails_reviewer插件,它是我的前同事(不确定我进公司时他还在不在) David Stevenson 写的一个帮助你优化SQL查询的插件,它可以帮助你定位数据库查询的瓶颈所在,从而通过编制索引已经缓存关键变量来改进性能。 rails_reviewer的安装很简单: $ script/plugin install git://github.com/dsboulder/query_reviewer.git $ rake query_reviewer:setup 现在重启服务器,你就会在屏幕的左上角看到一个小窗口,点击这个窗口,就会显示加载当前页面的所有SQL查询,并且会告诉你那些是没问题的,那些是需要优化的,如下图: 可以看到,在优化前这个请求执行了1101条SQL查询,并且大部分都是没有cache的,你可以通过rails_reviewer查看每条查询的SQL语 句以及代码的调用栈,优化主要从两方面进行,一个是提高查询性能,这个可以通过添加索引,另一个就是减少查询数量,这个可以通过缓存变量,比如: def production(name)   @production_cache ||= {}   @production_cache[name] ||= buildings.map{|b| b.production(name)}.sum end 下面是优化后的结果,可以看到,优化后查询数从1101变成了94,时间则从800多毫秒减到了59毫秒,大约只有原来的10分之一不到:

Posted in 性能 | 2 Comments

Rails 2.2 国际化(i18n) 简明指南

Rails 2.2出来有段时间了,前段时间需要个Wiki程序,于是试着将Instiki(Ruby on Rails官方网站的Wiki程序)移植到了2.2(http://github.com/yzhang/instiki_i18n/tree/master),同时加上了i18n支持,需要建Wiki的朋友可以试试,不过中间发现网上的指南都讲的不太全,所以我决定把看过的几个帖子整理下,合并出一个稍微完整的指南。 基本用法 基本用法想必大家都知道了,Rails默认的Locale文件夹在config/locales下,假设你要支持中文和英语,那么你需要在这个文件夹下放置en.yml和zh.yml。 # zh.yml zh:   submit: ‘提交’  create: ‘创建’ #en.yml en:   submit: ‘Submit’   create: ‘Create’ Rails 会自动加载config/locales目录下的locale文件,如果你的locale文件放在别的地方,那么你可以通过修改I18n.load_path来加载它: # in config/initializer/locale.rb I18n.load_path += Dir[ File.join(RAILS_ROOT, 'lib', 'locale', '*.{rb,yml}') ] 使用很简单,你可以进入Console进行测试: > I18n.t ‘submit’ => “Submit” > I18n.locale = ‘zh’ => “zh” > I18n.t(‘submit’) => “提交” 试图中更加简单,你可以直接调用t方法: <%= t ‘submit’ %> 传递变量 有些时候,我们的字符串中可能需要包含变量,只需要将其放在两个大括号内就可以了: [...]

Posted in 指南 | 3 Comments

Xapian,Sphinx在Rails中的性能比较

Xapian 和 Sphinx都是非常棒的开源全文搜索解决方案,但是我想知道哪个性能更好一些,Xapian官方提供了与Solr的对比,但是没有和Sphinx的,所以我决定自己来测试。 这两个都是开源的解决方案,你可以使用他们来搜索任何关键字比如马,桃子或者是Getminted等等,也可以使用通配符进行更广范围的查询。 数据集 要测试首先需要准备好数据集,我的数据是大约12000条blog记录,每个记录有两个字段需要搜索:title, description,代码如下: class Blog < ActiveRecord::Base   # Thinking sphinx indexes   define_index do     indexes :title     indexes :description   end   # Acts_as_xapian indexes   acts_as_xapian :texts => [ :title, :description ]    … end 测试环境 下面是我的测试环境: Sphinx: 0.9.8 Xapian: 1.0.1 Sphinx plugin: thinking_sphinx Xapian plugin: acts_as_xapian Ruby: 1.8.6 p114 Rails: 2.1.0 Mysql: 5.0.51 OS: [...]

Posted in 性能 | 5 Comments

Rails Templates

刚刚在译言上看到相关的介绍,但是感觉讲的不是很清楚,Rails Templates是Edge Rails中的一个新特性,它的作用实际上就是允许你自定义Rails(这里指的是命令行的那个可执行脚本)的行为,比如我们每次创建一个新应用之后,可能都会做一些重复的劳动,安装各种插件,跑migration,定制路由等等,现在Rails允许你将这些操作定义到一个模版文件中,以后你就可以通过调用这个模版来得到一个定制的Rails应用。 要使用Rails Templates功能,你首先需要定义一个模版: # blog_template.rb run “rm public/index.html” generate(:scaffold, “post title:string body:text”) route “map.root :controller => :posts” rake(“db:migrate”) 假设这个模版放在你的主目录下,你可以通过-m参数来调用这个模版: rails blog -m ~/blog_template.rb 可以看到,新创建的blog应用的index.html文件已经被删除了,并且默认路由指向了posts controller。 关于templates的更详细介绍,请参看译言的翻译。

Posted in 其它 | Leave a comment