在此系列博文中,我们会一步步去实践如何改变Rails应用的默认设计使其变得更加责任清晰并且容易测试。
顺便也看看其他部分的内容吧!
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】
{测试窝原创译文,译者:婷婷}
译者简介:婷婷,一个萌妹子~