`
Readonly
  • 浏览: 150815 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

师傅领错门,害了你个人 - ruby/rails新手避免入错门

阅读更多
最近看到一位Ruby On Rails新手写的代码,简直是惨不忍睹,问了一下他竟然是用李刚写的那本<<Ruby on Rails敏捷开发最佳实践>>作为入门材料的,偶真是faint,啥也不多说了,为了让更多的Ruby On Rails的新手避免走弯路,偶觉得很有必要来评论一下这本书,以china pub上下载的第15章样章为例子:
http://www.china-pub.com/39348

这章是讲一个注册用户通过邮件注册激活的例子,偶们来看看所谓的最佳实践实际是如何成为绝佳反面教材:
1. 创建一个用户表
这里使用的是sql,而不是Rails最佳实践推荐的migration

2. 用户表中直接用明码保存用户的密码
请各位作实际开发新手注意:任何一个应用都不应该犯这样愚蠢的错误

3. 标示用户是否激活的字段名叫is_actived
这不符合rails的最佳实践写法,对于boolean类型的数据,应该省略前面的is_,ActiveRecord会自动加个?号,映射成actived?

4. User模型的校验功能用errors.add这样手工的方法
最佳实践是使用Validation DSL,除非ActiveRecord提供的DSL不能满足你的特殊校验需求,否则毫无必要自己手工处理
就算你有很特殊的校验需求,在这段代码里面也应该使用errors.add_to_base,而不是用errors.add_base,跟一个空白的字符串

5. 设置用户的默认激活为false:@user.is_activated = false
Rails的理念是COC和DRY,这种初始默认值的设定应该在创建数据库定义的时候指定,而且默认的boolean都是false,这里的赋值完全是多此一举

让我们先休息和回顾一下,上面提到的5个绝佳反面教材竟然是出现在一个章节中的一个小段:15.4.1基本注册功能,错误之密集真是令人咋舌。
如果你和偶一样,还能忍受下去,恭喜你,你具备了给烂代码作Code Review的基本要求:耐力

偶们来继续往下看:
6. 看看发送邮件的代码
@sent_on = Time.now
@headers = {}


@sent_on指定的是邮件头信息中的Date,默认就是使用当前时间,这里的赋值也是多此一举
@headers指定的是邮件头信息的hash,这里也是也是多此一举
结合之前的问题5,李刚老师您这是用无用代码来充书本厚度么?


7. if user != nil && user.is_activated == false
user.is_activated == false ??? 这叫啥代码阿? 偶的天哪,李刚老师可能是为了保持风格统一,后面果然还有 user.is_activated == true ,这是偶看到搞笑的代码了...

8. pro_activate Action的代码写得及其冗长
综合前面的错误,偶想李刚可能压根不懂一些ruby和rails的惯用法,偶好为人师一下,符合ruby风格的代码应该是这样:
def pro_activate
  user = User.find_by_name_and_active_code(params[:name], params[:active_code])
  if user 
    if user.actived?
      flash[:notice] = "您的账户已经处于激活状态,请勿重复激活!"		
    else
      user.update_attribute(:activated , true)
      flash[:notice] = "恭喜您,您已经成功激活了您的账户!"
    end
  else
    flash[:notice] = "激活失败!"
  end
end

而且在实际开发中,作为最佳实践,最后一个else判断完全是不必要的,大家可以想想什么情况下会出现跑到最后一个else?嗯,只有在恶意构造url攻击的情况下,这样我们完全可以改成:
User.find_by_name_and_active_code_and_active(params[:name], params[:active_code], false)
在之后的pro_login action里面的代码就不多说了,和前面一样,也有user != nil && user.is_activated == false这样搞笑的代码出现。

看完了这个短短5页的样章中有那么多的错误,偶明白了为什么那个新手写的代码是如此的惨不忍睹,虽然俗话说,师傅领进门,修行在个人,但是也要晓得:师傅领错门,害了你个人
最后推荐了另外几本Ruby和Rails的书给他,让他好好改造去了...
分享到:
评论
200 楼 下一站,火星 2008-11-13  
其实事情就是这么个事情,我的看法是不能把他们逼的太厉害,总得留口饭给别人!此贴可以休矣,锁定吧,主要是不想让Robbin又扯上什么法律问题,这帮人非常厉害,什么对策都有!最好做个互不干涉的申明,那帮愿意往培训机构里面跳的人其实和我们一毛钱的关系也没有!
199 楼 yunhaifeiwu 2008-11-13  
下一站,火星 写道

你们可能不相信我说的话,举个活生生的例子吧,那个Itian就是个例子,我早就发现这个人有问题,这个人发帖很空洞,一般是上传些资料和展示一些他们的培训系统的例子什么的,而且可以观察到这个人自己不懂ruby,非常喜欢跑到ruby技术区和稀泥,我比较奇怪的是人家讨论ruby和他有什么关系,他做他的java呗,后来偶化名一个mm加他QQ摸清了底细,此人系新东方集团分公司的一个副总,34岁,聊天记录我还有(5页)。现在的培训市场的情况是这样的,大部分是做java的!很多资深的讲师大都是搞java的,做ror/python等略微新一点的技术的几乎没有,一旦新兴技术发展起来之后,无疑给了培训机构以沉重的打击!所以为了饭碗,他们不得不在JE上大肆宣传他们所培训的那些技术!


OH,卖糕!一些无能无德的讲师!要顶起来!

号称最佳实践的书,理应严瑾,就算是为了某些方便,也应特别注解说明,不要误了新手!
198 楼 jkfzero 2008-11-13  
有人暴巨料了
197 楼 ddd 2008-11-13  
bcccs 写道
我一直觉得LZ非常无聊,人家LG也没有动了ReadOnly的奶酪,碍着谁了?培训老师有好的么?
误人子弟?那些人还用误?

我一直觉得bcccs非常无聊,人家readonly也没有动了bcccs的奶酪,碍着谁了?
196 楼 robbin 2008-11-13  
下一站,火星 写道
你们可能不相信我说的话,举个活生生的例子吧,那个Itian就是个例子,我早就发现这个人有问题,这个人发帖很空洞,一般是上传些资料和展示一些他们的培训系统的例子什么的,而且可以观察到这个人自己不懂ruby,非常喜欢跑到ruby技术区和稀泥,我比较奇怪的是人家讨论ruby和他有什么关系,他做他的java呗,后来偶化名一个mm加他QQ摸清了底细,此人系新东方集团分公司的一个副总,34岁,聊天记录我还有(5页)。现在的培训市场的情况是这样的,大部分是做java的!很多资深的讲师大都是搞java的,做ror/python等略微新一点的技术的几乎没有,一旦新兴技术发展起来之后,无疑给了培训机构以沉重的打击!所以为了饭碗,他们不得不在JE上大肆宣传他们所培训的那些技术!


原来如此,想不到有这许多玄机呀! readonly这“打草惊蛇”之计必须坚决的贯彻下去。顶这个帖子,楼上的人肉太强了
195 楼 阳光晒晒 2008-11-13  
这世道.....
194 楼 庄表伟 2008-11-13  
下一站,火星 写道
你们可能不相信我说的话,举个活生生的例子吧,那个Itian就是个例子,我早就发现这个人有问题,这个人发帖很空洞,一般是上传些资料和展示一些他们的培训系统的例子什么的,而且可以观察到这个人自己不懂ruby,非常喜欢跑到ruby技术区和稀泥,我比较奇怪的是人家讨论ruby和他有什么关系,他做他的java呗,后来偶化名一个mm加他QQ摸清了底细,此人系新东方集团分公司的一个副总,34岁,聊天记录我还有(5页)。现在的培训市场的情况是这样的,大部分是做java的!很多资深的讲师大都是搞java的,做ror/python等略微新一点的技术的几乎没有,一旦新兴技术发展起来之后,无疑给了培训机构以沉重的打击!所以为了饭碗,他们不得不在JE上大肆宣传他们所培训的那些技术!


哇,这个帖子值得单独加精啊!
193 楼 下一站,火星 2008-11-13  
<p>我觉得双方还是走和解的路线吧……</p>
<p> </p>
192 楼 下一站,火星 2008-11-13  
<p>李刚老师的书谁愿意买谁买呗</p>
<p> </p>
191 楼 bcccs 2008-11-13  
我一直觉得LZ非常无聊,人家LG也没有动了ReadOnly的奶酪,碍着谁了?培训老师有好的么?
误人子弟?那些人还用误?
190 楼 下一站,火星 2008-11-13  
LZ不必理会一些无厘头的扯淡,有什么好扯的,LZ已经分析的很到位,看不懂的话,请闭嘴思过去…………
189 楼 justry 2008-11-13  
鄙视 李刚
写得书 错误太多,该 细的地方不细。
188 楼 bookong 2008-11-13  
好像完全跑题了……
187 楼 抛出异常的爱 2008-11-13  
笑翻.......
楼上有说相声的潜力
为什么不在我摊子对面开个场说相声呢?
186 楼 yunhaifeiwu 2008-11-13  
抛出异常的爱 写道

楼上俩人好累啊
如果是好的习惯
你会常常看见.
如果不是好习惯
只会流行一阵子

人是主要矛盾.
当人人都用
那么你写的再晦涩如 "大姨妈"
也不会有什么问题.

如果不常用.你们两费半天力
娇情啥
(北京话 二声 轻声 只是为做个例子)

抛出异常的爱 写道

楼上俩人好累啊
如果是好的习惯
你会常常看见.
如果不是好习惯
只会流行一阵子

人是主要矛盾.
当人人都用
那么你写的再晦涩如 "大姨妈"
也不会有什么问题.

如果不常用.你们两费半天力
娇情啥
(北京话 二声 轻声 只是为做个例子)

抛出异常的爱 写道

楼上俩人好累啊
如果是好的习惯
你会常常看见.
如果不是好习惯
只会流行一阵子

人是主要矛盾.
当人人都用
那么你写的再晦涩如 "大姨妈"
也不会有什么问题.

如果不常用.你们两费半天力
娇情啥
(北京话 二声 轻声 只是为做个例子)

抛出异常的爱 写道

楼上俩人好累啊
如果是好的习惯
你会常常看见.
如果不是好习惯
只会流行一阵子

人是主要矛盾.
当人人都用
那么你写的再晦涩如 "大姨妈"
也不会有什么问题.

如果不常用.你们两费半天力
娇情啥
(北京话 二声 轻声 只是为做个例子)

抛出异常的爱 写道

楼上俩人好累啊
如果是好的习惯
你会常常看见.
如果不是好习惯
只会流行一阵子

人是主要矛盾.
当人人都用
那么你写的再晦涩如 "大姨妈"
也不会有什么问题.

如果不常用.你们两费半天力
娇情啥
(北京话 二声 轻声 只是为做个例子)



哈哈 ,习惯,说的真对!
国际礼仪,很好,很不错,可是,有多少人完全按国际礼仪做呢?

大礼不顾细节!

有时不要老纠缠于细节! 如果能够注意就注意,但不要刻意于学什么细节处的好习惯,

当然李纲的不足,我BS! 如果非要学孔乙已,一个字要弄N个写法出来,我看没必要!

185 楼 抛出异常的爱 2008-11-13  
代码风格与代码统一的论证.
就如同帝国主义与民主主义
大蛇与红石
一样
没有绝对多数人口的赞同
现阶段共存着吧.

PS:你Ps我也Ps
对于if(!isRight()){}
我认为我还是能看的懂的
大不了加上log4j&debug
if(false==isRight()){}elseif(!!!isTrue()){}
这东西我是很少见到的.
再有理也会让我蒙一下子打断我的思路

大家现阶段还是以每个方法少几行为主要努力目标吧
184 楼 icewubin 2008-11-13  
Readonly 写道
icewubin 写道

我确信李刚的书中会出现isXXX == false,但是绝对不会出现isXXX == true。


看在熟人的面上,你至少回帖也要看贴把...
readonly 写道

user.is_activated == false ??? 这叫啥代码阿? 偶的天哪,李刚老师可能是为了保持风格统一,后面果然还有 user.is_activated == true ,这是偶看到搞笑的代码了...


哇塞,下跪面壁道歉中。。。

跪了一会儿站起来了,不对呀,那你应该要看到“user.is_activated == true”才能说前面的“user.is_activated == false”是搞笑,不能一上来就说这个代码搞笑吧。
183 楼 Readonly 2008-11-13  
icewubin 写道

我确信李刚的书中会出现isXXX == false,但是绝对不会出现isXXX == true。


看在熟人的面上,你至少回帖也要看贴把...
readonly 写道

user.is_activated == false ??? 这叫啥代码阿? 偶的天哪,李刚老师可能是为了保持风格统一,后面果然还有 user.is_activated == true ,这是偶看到搞笑的代码了...
182 楼 bcccs 2008-11-13  
Readonly 写道
bcccs 写道

单论上面一句,他说的没错啊。ror和java高手出来说说嘛。

这个不需要高手,偶就可以告诉你:这种if boolean == boolean的代码无论出现在李刚的书里面还是出现在哪个所谓著名的开源代码里面,都是属于新手作品。如果你被XX作者或者XX著名开源的光环所迷惑,进而开始怀疑自己的判断,很好,脑白金广告或者那些男科医院的广告就是专门为你拍的。

if false==xx不见得有什么必死的罪吧,一定要用!么?
181 楼 icewubin 2008-11-13  
抛出异常的爱 写道
楼上俩人好累啊
如果是好的习惯
你会常常看见.
如果不是好习惯
只会流行一阵子

人是主要矛盾.
当人人都用
那么你写的再晦涩如 "大姨妈"
也不会有什么问题.

如果不常用.你们两费半天力
娇情啥
(北京话 二声 轻声 只是为做个例子)


源头是楼主为了鄙视lg(我也鄙视),举了这个例子硬是要说lg傻冒,傻冒是存在的,但是这个理由不妥。

我确信李刚的书中会出现isXXX == false,但是绝对不会出现isXXX == true。

总结来说,骂人也要骂得有理啊,李敖就是榜样。

相关推荐

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    ### Ruby on Rails Guides v2 - Ruby on Rails 4.2.5 #### 一、重要概念及基础假设 - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:...

    转载 - 26本 Ruby/Rails 相关英文图书简评

    Ruby 和 Rails 是两种非常重要的 IT 技术,它们在软件开发领域中占据着重要的地位。Ruby 是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。Rails,全称为 Ruby on Rails,是...

    Ruby - Ruby for Rails

    ### 一、Ruby/Rails 景观 #### 1.1 如何理解 Ruby 的工作原理 - **基础概念**:介绍 Ruby 作为一种动态类型的面向对象编程语言的基础知识。 - **解释器与虚拟机**:讲解 Ruby 是如何通过解释器或虚拟机运行的。 - *...

    征服-Ruby On Rails.rar

    Ruby on Rails,简称Rails,是一种基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率,强调简洁和生产力。Rails的核心理念是“Don't Repeat Yourself”(DRY)和...

    Packt - Ruby on Rails Enterprise Application Development (Oct 2007)

    《Ruby on Rails企业应用程序开发》是一本面向专业开发者和对企业级应用有需求的读者的经典教程。这本书详尽地探讨了如何使用Ruby on Rails框架来构建高效、可扩展且可靠的大型企业级应用程序。Ruby on Rails(简称...

    bugsnag-ruby, Rails Sinatra rack 和 ruby的Bugsnag错误监视.zip

    bugsnag-ruby, Rails Sinatra rack 和 ruby的Bugsnag错误监视 ruby的 Bugsnag异常报告器 ruby 异常报告器提供了从你的 Rails Sinatra/英镑/或者英镑的普通 ruby 应用程序中抛出的异常通知。 任何未捕获的异常都会...

    Ruby-on-Rails-rails.zip

    Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zipRuby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zipRuby_on_...

    College-Management-System---Ruby-On-Rails:Ruby On Rails-CMS

    学院管理系统-Ruby on Rails 学校/学院管理系统 该系统是一个非常全面的系统,并且在考虑到学校和学院功能的前提下进行了清晰的查看。 它使用以下技术构建- Ruby On Rails Bootsrap(CSS / JavaScript框架) ...

    Wrox - Beginning Ruby on Rails

    该书由经验丰富的技术作家Steven Holzner撰写,内容全面覆盖了Ruby on Rails的基础知识,并提供了丰富的示例代码和实践项目,非常适合那些想要快速上手Ruby on Rails的新手开发者。 #### 三、书籍内容概览 - **Ruby...

    Ruby on Rails Tutorial

    《Ruby on Rails Tutorial》中文版(原书第2版,涵盖 Rails 4) Ruby 是一门很美的计算机语言,其设计原则就是“让编程人员快乐”。David Heinemeier Hansson 就是看重了这一点,才在开发 Rails 框架时选择了 Ruby...

    hello-ruby-rails:一个基于Rails的简单hasura项目

    你好Ruby路轨 本快速入门由使用Rails的基本Hasura项目组成。 将项目部署到Hasura集群后,您将在运行Rails应用程序 如果您打算使用Hasura构建或想学习构建Rails应用程序,那么这是一个正确的起点。 步骤1:取得专案 $...

    Ruby on Rails入门经典代码

    Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习...

    ruby on rails 101

    引用自Nathan Torkington的话:“使用Ruby on Rails就像观看功夫电影一样,看似弱小的新手框架却能够用各种创造性的方式打败众多强大的对手。”这句话生动地描述了Ruby on Rails的独特之处以及它在Web开发领域的影响...

    Packt - Ruby on Rails Web Mashup Projects (Apr 2008)

    《Ruby on Rails Web混合项目》 英文PDF + 源码

    Ruby-GoOnRails使用Rails生成器来生成一个Golang应用

    **Ruby-GoOnRails:利用Rails生成器构建Golang应用** Ruby on Rails(简称Rails)是一种流行的Web开发框架,以其“约定优于配置”的理念和高效的开发速度受到开发者喜爱。而Go(Golang)则是一种静态类型、编译型的...

Global site tag (gtag.js) - Google Analytics