Rails模式的实际应用--第一部分:Model(上)

2017-02-21   出处: 8th light  作/译者:Christoph Gockel / 婷婷

  

  在此系列博文中,我们会一步步去实践如何改变Rails应用的默认设计使其变得更加责任清晰并且容易测试。

  顺便也看看其他部分的内容吧!

  Rails模式的实际应用--第二部分:Views

  Rails模式的实际应用--第三部分:Controllers

  你可以参照GitHub上的知识库,里面会包含我们讨论的所有代码。

  Active Record模式是Rails默认的持久性框架。使用它会使得我们为应用程序设计数据模型的过程更加容易。读写数据相对比较简单,但Active Record一些扩展特性的简单性也掩盖了它的许多弊端。这些弊端在小程序里不会暴露出来,但是却会在我们的应用程序逐渐变大的过程中对我们的产品造成很大的影响。

  例如,我们可以在保存记录到数据库的时候随意添加自定义验证。但是一旦我们想改变这个定义使其成为一个有效的记录的时候,虽然最初只是对某一个特征的简单应用,此时也会变为一个高开销的重构。

  为此,我们可以看看示例应用程序里面的movie类。

  class Movie < ActiveRecord::Base

  validates :title, presence: true

  validate  :release_date_is_after_1895

  private

  def release_date_is_after_1895

    if release_date.nil?

      errors.add(:release_date, "must be be provided.")

    elsif release_date.year < 1895

      errors.add(:release_date, "is older than the world's first motion picture.")

    end

  endend

  每当一个movie类被实例化,Active Record将会确认它至少有一个名字以及发布的日期不早于1895年。到目前为止一切似乎都很顺利,那么上面的代码有什么问题呢?

  Validates:title的简单性,是Active Record的一个特征,它允许用这样简单、简洁的方式来表达需要一个title。但是对这些需求频繁变化的模型来说,却很容易带来麻烦。特别是在一个需要创建很多movie实例的测试套件里面。每次我们改变什么才是有效的movie实例的定义的时候,都有可能会对我们的代码库带来影响。这就是所谓的“shotgun sergery”。

  在一定程度上,像factory_girls一类的gems能缓和这些问题。但是在我们继续并拉取更多的依赖去解决掉这些症状之前,我们需要搞清楚问题的根源在哪里。

  刚刚描述的问题不止出现在我们应用程序的测试套件里。当一个用户想要编辑一个项目但是没有做任何修改的时候,也会出现相同的问题。可能会突然出现一个验证消息,告诉用户她刚刚编辑的项目现在无效了。虽然验证工作没被影响这一点很好,但是从用户的角度来说,仍然会感到意外和吃惊。


待续


【英文原文:https://8thlight.com/blog/christoph-gockel/2016/10/19/getting-rails-on-track-part-1-models.html

{测试窝原创译文,译者:婷婷}

译者简介:婷婷,一个萌妹子~




声明:本文为本站编辑转载,文章版权归原作者所有。文章内容为作者个人观点,本站只提供转载参考(依行业惯例严格标明出处和作译者),目的在于传递更多专业信息,普惠测试相关从业者,开源分享,推动行业交流和进步。 如涉及作品内容、版权和其它问题,请原作者及时与本站联系(QQ:1017718740),我们将第一时间进行处理。本站拥有对此声明的最终解释权!欢迎大家通过新浪微博(@测试窝)或微信公众号(测试窝)关注我们,与我们的编辑和其他窝友交流。
269° /2683 人阅读/1 条评论 发表评论

邓智群  2017-02-22

可否在细化一下什么是Rails?


登录 后发表评论