9.5 小结

我们用了好几章介绍如何实现用户资源,在 5.4 节用户还不能注册,而现在不仅可以注册,还可以登录、退出、查看个人信息、修改信息,还能浏览网站中所有用户的列表,某些用户甚至可以删除其他用户。

现阶段实现的演示应用建立了坚实的基础,完全可用于任何需要认证用户和权限系统的网站。第 10 章会实现两个附加功能:向新注册的用户发送账户激活链接(同时验证电子邮件地址有效),以及密码重设功能,帮助忘记密码的用户。

在继续阅读之前,先把本章所做的改动合并到 master 分支:

$ git add -A
$ git commit -m "Finish user edit, update, index, and destroy actions"
$ git checkout master
$ git merge updating-users
$ git push

你还可以部署这个应用,甚至使用示例用户填充生产数据库(pg:reset 用于还原生产数据库):

$ bundle exec rake test
$ git push heroku
$ heroku pg:reset DATABASE
$ heroku run rake db:migrate
$ heroku run rake db:seed
$ heroku restart

当然,在真实的网站中你或许并不想向数据库中添加示例数据,我加入这个操作只是为了查看生产环境中的效果(图 9.16)。生产环境显示的示例用户顺序各异,我的网站显示的顺序就和本地不同(图 9.11)。这是因为,我们没有指定从数据库中取回用户的顺序,所以目前的顺序由数据库决定。这对用户而言没什么问题,但微博就不同了,我们会在 11.1.4 节解决这个问题。

heroku sample users图 9.16:生产环境显示的示例用户

9.5.1 读完本章学到了什么

  • 可以使用编辑表单修改用户的资料,这个表单向 update 动作发送 PATCH 请求;

  • 为了提升通过 Web 修改信息的安全性,必须使用“健壮参数”;

  • 事前过滤器是在控制器动作前执行方法的标准方式;

  • 我们使用事前过滤器实现了权限系统;

  • 针对权限系统的测试既使用了低层命令直接向控制器动作发送适当的 HTTP 请求,也使用了高层的集成测试;

  • 友好转向会在用户登录后重定向到之前想访问的页面;

  • 用户列表页面列出了所有用户,而且一页只显示一部分用户;

  • Rails 使用标准的文件 db/seeds.rb 向数据库中添加示例数据,这个操作使用 rake db:seed 任务完成;

  • render @users 会自动调用 _user.html.erb 局部视图,渲染集合中的各个用户;

  • 在用户模型中添加 admin 布尔值属性后,会自动创建 user.admin? 布尔值方法;

  • 管理员点击删除链接可以删除用户,点击删除链接后会向用户控制器的 destroy 动作发起 DELETE 请求;

  • 在固件中可以使用嵌入式 Ruby 创建大量测试用户。