Categories
未分类

什么叫"功能单一"

昨天开始看《Build Awesome Command-Line Applications in Ruby 2》这本书,看完第一章。其中提到一个Awesome的Command,应该是功能单一(single-purpose)的,但是具体什么叫功能单一呢?为了解释这个问题,书中举了两个反例,来解释什么不是功能单一。 第一个例子是一个备份数据库的脚本。其中需要备份的数据库有两个,这个脚本一次性把两个脚本都备份了,脚本大概是这么写的: #!/usr/bin/env ruby # File: db_backup.rb #两个数据库的信息 databases = { big_client: { database: ‘big_client’, username: ‘big’, password: ‘big’, }, small_client: { database: ‘small_client’, username: ‘small’, password: ‘p@ssWord!’, } } databases.each do |name,config| #依次备份每个数据库 #… end 使用的时候,只需要运行一个这个命令就好了。但是这个脚本的结构其实并不好,也并不是"功能单一",之所以这么说,是因为它一次性备份了两个数据库,而不是一个。试想一下,如果后来又有一个数据库需要备份,那么就得改这个脚本,修改上面databases这个Hash(Map、Dictionary,whatever)。这个可不是一个好主意,如果别人给你一个备份数据库的脚本,然后你说要再备份一个数据库,结果他说你要改那个脚本,这时候你的感觉可不会太好,如果这个人离职了呢?如果他用的是一门你不熟悉的语言写的呢?如果他用的是write-only的perl写的呢? 所以对于这个脚本,更好的组织方式是,脚本本身只备份一个数据库,并且需要的数据库信息是从外面传进来的。 比如可以这样写: #!/usr/bin/env ruby # File: db_backup.rb db_name = ARGV[0] #ARGV[0]就是传给这个脚本的第一个参数,以下类推 username […]

Categories
未分类

Rails Authentication From Scratch

这是一个对railscast250的学习笔记,所有copyright belongs to Railscast作者 Ryan Bates ### 1. 创建User Model rails g resource user email password_digest 这里有两点说明,一是关于rails g resource,你可能对rails g scaffold熟悉,那resource是什么呢?在这里,scaffold和resource都是rails generator,就是可以帮你自动生成很多琐碎的东西的助手,这样你就不用自己一遍一遍写类似的东西了。resource跟scaffold最主要的不同是,resource不会帮你生成对应的controller里面的任何个action以及他们对应的任何view;第二点需要说明的是“password_digest”这个字段,这个字段比较关键,因为接下来我们要用到rails为我们提供的has_secure_password这个helper method,这个method默认需要用到这个字段。 ### 2. Migrate database 在命令行执行rake db:migrate创建你的database ### 3. 打开model里面的user.rb,加上 has_secure_password class User < ActiveRecord::Base has_secure_password end has_secure_password这个方法我们前面提到过,它的作用是,利用前面提到的password_digest字段,给你提供password 和password_confirmation两个字段,并帮你做一些常见的validation,比如:密码不能为空,长度必须小于72字符,把password和password_confirmation两个字段进行对比,确保他们相等,等等。 ### 4. 安装bcrypt gem 前面提到的has_secure_password这个方法需要用到一个gem叫bcrypt,这个gem在你创建project的时候默认已经加到你的Gemfile里面去了,只不过默认被注释掉了。我们打开Gemfile,找到那一行并uncomment掉。接着执行 bundle install 进行安装,安装完这个gem以后,重启rails server让它生效。 ### 5. 添加extra validation 我们可以在User […]