阅读更多

6顶
0踩

编程语言

翻译新闻 5 个常见的 Rails 开发误区

2012-05-15 15:16 by 副主编 wangguo 评论(3) 有7374人浏览
本文作者是一名Rails开发者,他总结了在Rails开发过程中的一些常见误区。文章内容如下:

我使用Rails已经有一段时间了,在这期间我看了大量的Rails项目,下面的这五个常见的误区,我几乎在每一个Rails代码中都看到过。

1.  没有 schema 规范的迁移

数据模型是应用程序的核心。没有schema的约束,你的数据会因为项目代码上的bugs而慢慢变得糟糕,直到你无法相信库中的任何字段。这里有一个 Concact Schema:
create_table "contacts" do |t|
    t.integer  "user_id"
    t.string   "name"
    t.string   "phone"
    t.string   "email"
end

上面哪些需要更改呢?通常一个Contact必须依附于User,并且会有一个name 属性,这可以使用数据库约束来确保。可以添加“:null => false”,这样即使验证代码存在bugs,我们依然可以确保模型一致性,因为如果违反了null约束,数据库并不会允许模型保存这些数据。
create_table "contacts" do |t|
    t.integer  "user_id", :null => false
    t.string   "name", :null => false
    t.string   "phone"
    t.string   "email"
end

TIPS:使用“:limit => N”规范你的string类型字段的大小。Strings 默认255个字符,而phone字段应该不需要这么长吧!

2.  面向对象编程

大多数Rails开发人员并不写面向对象的代码。他们通常会在项目中写面向MVC的Ruby代码(把模型和控制器分开写在合适的位置)。通常是在lib目录下添加带有类方法的工具模块,仅此而已。但开发人员往往需要花费2-3年才能认识到“Rails就是Ruby。我完全可以创建一些简单的对象,并且不一定按照Rails建议的方式去封装它们。”

TIPS:对你调用的第三方服务使用facade(外观模式)。通过在测试中提供mock facade,你就不用在你的测试集中真的去调用这些第三方服务了。

3.  在 helpers中连接HTML

如果你正在创建helper,恭喜,至少说明你正在试图让你的视图层更整洁。但是开发人员经常不知道一些使用helpers创建标签的常见方式,这就导致了槽糕的字符串连接或者糟糕的插值形式。
str = "<li class='vehicle_list'> "
str += link_to("#{vehicle.title.upcase} Sale", show_all_styles_path(vehicle.id, vehicle.url_title))
str += " </li>"
str.html_safe

看吧,相当糟糕,而且容易导致XSS安全漏洞!让 content_tag 来拯救这些代码吧。
content_tag :li, :class => 'vehicle_list' do
  link_to("#{vehicle.title.upcase} Sale", show_all_styles_path(vehicle.id, vehicle.url_title))
end

TIPS:现在就开始在helper中使用blocks(代码块)吧。当产生内嵌的HTML时,嵌入的blocks更自然、更贴切。

4.  Giant Queries(大查询,比如载入整张表的查询)会把一切都加载到内存

如果你需要修正数据,你只需要遍历并且修正它,对吗?
User.has_purchased(true).each do |customer|
  customer.grant_role(:customer)
end

假设你有个百万级别客户的电商网站,假设每个用户对象需要500字节,上面的代码会在运行的时候消耗500M内存。

下面是更好的方式:
User.has_purchased(true).find_each do |customer|
  customer.grant_role(:customer)
end

find_each使用 find_in_batches 每次取出1000条记录,非常有效的降低了对内存的需求。

TIPS:使用 update_all 或者原始 SQL 语句执行大的更新操作。学习SQL可能需要花费点时间,不过带来的好处是明显的:你会看到100x的性能改善。

5.  代码审查

我猜你会使用GitHub,并且我进一步猜测你不会去pull requests(GitHub上的申请代码合并操作)。如果你需要花费一到两天去构建一个新特性,那么到一个分支上去做吧,然后发送一个 pull request。团队会审查你的代码,并且给出一些你没有考虑到的改进或者最新特性的建议。我保证这样会提高你的代码质量。我们在TheClymb项目中90%的改动都是通过这种方式完成的,并且这是100%值得去做的一个经验。

TIPS:不要没有经过任何测试就合并你的pull request。测试对保证应用的稳定性非常有价值,并且可以让你踏实地睡一个好觉。

英文原文:Five Common Rails Mistakes
6
0
评论 共 3 条 请登录后发表评论
3 楼 dohkoos 2013-04-21 13:08
find_each
update_all
这两个比较实用,记下了!
2 楼 lanqishao 2012-05-16 13:35
很实际 很多都遇到过
1 楼 jn615 2012-05-15 18:05
额, 好想是这么回事哦

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • SQL查找含有指定表名或者字段名的方法

    SELECT DISTINCT o.name, o.xtype   FROM syscomments c   INNER JOIN sysobjects o ON c.id=o.id   WHERE c.TEXT LIKE '%Timetable%'  select a.name from sysobjects a     inner join syscolumns b on a

  • 获取表的字段名

    sp_columns ­返回当前环境中可查询的指定表或视图的列信息­------------------------------------------------------­EXEC sp_columns @table_name = 表名(TABLE_NAME)­-----------------------------------------------------­

  • 【Web安全】Web开发中常见的安全误区

    下面来介绍Web开发中常见的一些安全误区。 如果我们使用Web框架,那么不必担心安全问题 一些流行的框架比如Rails和 Django在编写之初已考虑到安全性问题,并帮助防止常见的漏洞问题。然而,它们并不能阻止业务逻辑...

  • DevOps的常见误区

    在DevOps推广过程中有非常多的声音,有人说 DevOps 只适合特定的公司、特定的企业、特定的文化,他们的公司很难...所以在《DevOps Handbook》中专门有一个章节来谈一谈常见的 DevOps 误区,今天和大家一起分享解读下。

  • 架构设计和常见误区

    什么是架构和架构本质在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概...

  • java基础算法题,字节跳动Java开发

    SQL 语句执行慢的原因是面试中经常会被问到的,对于服务端开发来说也是必须要关注的问题。 在生产环境中,SQL 执行慢是很严重的事件。那么如何定位慢 SQL、慢的原因及如何防患于未然。接下来带着这些问题让我们开启...

  • AngularJS 开发中常犯的10个错误

    简介 AngularJS是目前最为活跃的Javascript框架之一,AngularJS的目标之一是简化开发过程,这使得AngularJS非常善于构建小型app...以下这份列表摘取了常见的一些AngularJS的错误用法,尤其是在app开发过程中。 ...

  • AngularJS开发人员最常犯的10个错误

    简介 AngularJS是目前最为活跃的Javascript框架之一,AngularJS的目标之一是简化开发过程,这使得AngularJS非常善于构建小型app...以下这份列表摘取了常见的一些AngularJS的错误用法,尤其是在app开发过程中。...

  • 在Ruby on Rails/Naked Objects精神指引下的域驱动开发框架

    这里我们不过多讨论ROR(Ruby on Rails),而是探讨如何以一个正确的方式快速开发J2EE。 现在的问题  现在我们J2EE开发碰到了什么问题呢? 让我们想象一下使用Spring和Hibernate开发一个J2EE WEB应用是...

  • 事实还是虚构?关于软件编程的 8 个神话

    尽管鼓舞人心的编码存在于创新应用程序的核心,并且开发人员可以通过编码表达他们的创造力,但我们看到他们中的许多人放弃了它。一个可能的原因是围绕编码存在许多神话,使其单调或不合逻辑。 但真的是这样吗? ...

  • AngularJS开发最常犯的10个错误

    简介 AngularJS是目前最为活跃的Javascript框架之一,AngularJS的目标之一是简化开发过程,这使得AngularJS非常善于构建小型app...以下这份列表摘取了常见的一些AngularJS的错误用法,尤其是在app开发过程中。 ...

  • 游戏开发学习指导

    ...然而因为我是在读书时自学C++的,也是游戏程序员(原问题中提到题主想从事游戏开发),觉得也许能提供一点意见供网友参考。 首先引一下2010年8月号《程序员》刊登的拙文《C++强大背后》最后

  • java开发安卓app电子书,含BATJM大厂

    Linux有架构,MySQL有架构,JVM也有架构,使用Java开发、MySQL存储、跑在Linux上的业务系统也有架构,应该关注哪一个?想要清楚以上问题需要梳理几个有关系又相似的概念:系统与子系统、模块与组建、框架与架构: 1

  • (转载)AngularJS开发人员最常犯的10个错误

    简介 AngularJS是目前最为活跃的Javascript框架之一,AngularJS的目标之一是简化开发过程,这使得AngularJS非常善于构建小型app原型,但...以下这份列表摘取了常见的一些AngularJS的错误用法,尤其是在app开发过程

  • JEDEC SPEC 最新版 合集 DDR2/DDR3/DDR4/DDR5/LPDDR2/LPDDR3/LPDDR4(X)/LPDDR5(X)

    JESD79-2F DDR2 JESD79-3F DDR3 JESD79-4D DDR4 JESD79-5C DDR5 JESD209-2F LPDDR2 JESD209-3C LPDDR3 JESD209-4E LPDDR4 JESD209-4-1A LPDDR4X JESD209-5C LPDDR5(X)

  • COMSOL二维光子晶体角态研究:单胞与超胞能带计算及边界态与角态特性分析,COMSOL二维光子晶体角态研究:单胞与超胞能带计算及边界态与角态特性分析,comsol二维光子晶体角态 单胞能带,超胞能

    COMSOL二维光子晶体角态研究:单胞与超胞能带计算及边界态与角态特性分析,COMSOL二维光子晶体角态研究:单胞与超胞能带计算及边界态与角态特性分析,comsol二维光子晶体角态。 单胞能带,超胞能带,边界态以及角态计算。 ,comsol;二维光子晶体;角态;单胞能带;超胞能带;边界态计算,基于Comsol的二维光子晶体角态及能带边界计算研究

  • 六自由度机械臂抓取动作仿真与代码解析:抓取动画、关节参数变化及轨迹图解详解,六自由度机械臂抓取动作仿真指南:掌握两套代码实现动画与轨迹图模拟学习攻略,六自由度机械臂抓取动作仿真-8 两套关于抓取动作的

    六自由度机械臂抓取动作仿真与代码解析:抓取动画、关节参数变化及轨迹图解详解,六自由度机械臂抓取动作仿真指南:掌握两套代码实现动画与轨迹图模拟学习攻略,六自由度机械臂抓取动作仿真-8 两套关于抓取动作的代码,包括抓取动画、关节角、角速度、角加速度的变化仿真、以及抓取轨迹图 简单易懂好上手~ ,六自由度机械臂;抓取动作仿真;抓取动画;关节角变化;角速度角加速度;抓取轨迹图;两套代码;简单易懂好上手,六自由度机械臂抓取动作仿真演示:代码与轨迹图解

  • ITC网络广播工具软件

    ITC网络广播工具软件

Global site tag (gtag.js) - Google Analytics